【问题标题】:Passing objects to functions将对象传递给函数
【发布时间】:2018-07-14 12:12:50
【问题描述】:

我目前正在研究旨在建模经验数据的用户定义函数,但我在传递给函数的对象/参数方面遇到问题:

bestModel <- function(k=4L, R2=0.994){
  print(k)   # here, everything is still fine

  lmX <- mixlm::lm(getLinearModelFunction(k), data)
  best <- mixlm::best.subsets(lmX, nbest=1)
  .
  .
  .
}

起初,一切都按预期工作,但只要我想将参数k 传递给另一个用户定义的函数getLinearModelFunction(),就会引发错误:

Error in getLinearModelFunction(k) : object 'k' not found 

如果我要分配一个新参数,例如,它没有帮助。 G。 l &lt;- k 并尝试传递它。该参数似乎不适用于其他功能。我不仅在原始数据类型上遇到了这个问题,而且在复杂结构上也遇到了这个问题。在命令行上,只要对象在我的工作区中,一切正常。

总结一下:传递参数仅在该函数内有效,但从那里调用其他函数会导致错误。为什么?并且:该怎么办?

编辑: 在尝试解决问题时,它变得非常奇怪。我剥离了所有功能:

functionA <- function(data, k){
      lmX <- mixlm::lm(functionB(k), data)
      summary(lmX)

      # best <- mixlm::best.subsets(lmX,nbest=1)
    }


    functionB <- function(k=4){
      if(k==1){
        return(formula("raw ~ L1"))
      }else if(k==2){
        return(formula("raw ~ L1 + L2"))
      }else if(k==3){
        return(formula("raw ~ L1 + L2 + L3 "))
      }else if(k==4){
        return(formula("raw ~ L1 + L2 + L3 + L4"))
      }
    }

假设,我们有一个 data.frame d,其中包含变量 raw、L1、L2、L3、L4 ... 只要在 best 之前有注释 #,它就可以工作。一旦它被删除,调用 functionA(d, 3) 会导致

Error in functionB(k) : object 'k' not found  

尽管 k 在该函数中没有发挥作用,但在此之前,它起作用了。

【问题讨论】:

  • getLinearModelFunction 在您自己调用它时是否按预期工作?从bestModel 函数中调用自定义函数(使用参数k)没有问题。
  • 也许您可以尝试将k 替换为eval(parse(text = k) 以使内部函数与所需的对象/内容一起工作。
  • 非常感谢 cmets。当直接从命令行调用时,getLinearModelFunction 运行良好。 eval(parse... 不能解决问题。所有用户定义的函数都存在于工作区中。顺便说一句:我使用 RStudio,它们显示在全局环境中。是否有不同的环境?
  • 错误来自getLinearModelFunction,而不是bestModel,我们不知道该函数包含什么,因为问题没有包含它,但它在某处包含对k的引用没有定义k
  • getLinearModelFunction 非常简单:
    # 根据k生成线性回归模型函数 getLinearModelFunction 6){ message("参数 k 超出范围;设置为 6") k 

标签: r


【解决方案1】:

好的,确实,这是一个环境问题。解决方案是获取当前环境并从那里获取对象:

functionA <- function(data, k){
   e <- environment()
   lmX <- mixlm::lm(functionB(e$k), e$data)
   summary(lmX)

   best <- mixlm::best.subsets(lmX,nbest=1)
 }

当直接使用 are 包时,这通常不是问题。对象通常在全局环境中。使用函数时,每个函数都有自己的环境。我在开始学习打包代码的同时设法解决了这个问题:http://adv-r.had.co.nz/Environments.html

【讨论】:

    猜你喜欢
    • 2015-08-30
    • 2011-12-07
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    相关资源
    最近更新 更多