【问题标题】:Object not found within R function在 R 函数中找不到对象
【发布时间】:2016-06-07 10:34:52
【问题描述】:

我在一个更大的函数中有几个tslm 函数(来自forecast R 包)。我似乎无法让他们都找到他们的相关对象。包括一个显式环境修复了一个实例并破坏了另一个实例。一个最小的例子如下:

library(forecast)
data(gas)

testlm <- function(x)
{
e<-new.env()
e$x<-x
   tslm(e$x~trend)->e$z
return(e$z)
}

testlm(gas)

这会引发以下错误:

 Error in eval(expr, envir, enclos) : object 'e' not found

我还尝试通过设置明确地为公式提供正确的环境

e$f<-as.formula("e$x~trend+season",env=e)

但得到了完全相同的错误。

附:另一个错误似乎更难重现,但让它与显式环境一起工作就足够了。

【问题讨论】:

    标签: r environment forecasting


    【解决方案1】:

    终于明白了!为了避免弄乱tslmlm 的环境,您可以将数据作为单独的参数。将tslm 行更改为

    tslm(data ~ trend,data=e$x)
    

    正常工作。

    【讨论】:

      【解决方案2】:

      首先,您这样做是否有原因而不是:

      testlm <- function(x) {
         return(tslm(gas~trend))
      }
      
       testlm(gas)
      Call:
      tslm(formula = gas ~ trend)
      
      Coefficients:
      (Intercept)        trend  
          -9029.6        127.7  
      

      我不确定你为什么需要这个新环境。

      但是,无论如何。问题是您正在创建一个嵌套在函数环境中的新环境。当您使用 return 时,它无法从这个嵌套环境中提取值。相反,您需要通过在函数之前定义它来使这个环境全局可用:

      library(forecast)
      data(gas)
      e <- new.env()
      testlm <- function(x) {
        e$x <- x
        e$z <- tslm(e$x~trend)
        return(e$z)
      }
      
      testlm(gas)
      

      【讨论】:

      • 当我试图在一个包中收集我的函数时,我有点不愿意求助于在它们之外设置环境。另外,我尝试将 e 设置为将 `emptyenv()' 作为父级(在函数内部定义),但出现了同样的错误。