【问题标题】:problems with scope; R cannot find an object in the environment of a function范围问题; R在函数环境中找不到对象
【发布时间】:2015-04-13 14:11:36
【问题描述】:

我的目标是拟合模型并在每次变化时生成预测 y 和 x 变量。这将使我的代码更加简洁。

当我尝试对测试时间序列进行预测时 R 抛出一个错误: eval(expr,envir,enclos)中的错误:找不到对象'train' 但是 train 是在函数的本地环境中产生的 如果我将 train 移动到全局环境中,则没有错误

我需要做什么才能使所有语句都包含在函数中?

library(fpp)
y <- (1:60)
z <- y + rnorm(60)
my.df <- data.frame(y,z)
NFcst <- 30

my.fcast <- fcast('y','z',my.df,NFcst) 

fcast <- function(a,b,df,h) {
  model <- paste(a,'~',b)
  x <- ts(data=df)  
  train.end <- time(x)[nrow(x)-h]
  test.start <- time(x)[nrow(x)-h+1]
  train <- window(x,end=train.end)
  test <- window(x,start=test.start)
  fit <- lm(model, data=train)
  my.fcast <- forecast(fit,test)   #error object 'train' not found
}

#If I move train to the global environment, there is no error
x <- ts(data=my.df)  
train.end <- time(x)[nrow(x)-NFcst]
train <- window(x,end=train.end)

my.fcast <- fcast2('y','z',my.df,NFcst)

fcast2 <- function(a,b,df,h) {
  model <- paste(a,'~',b)
  test.start <- time(x)[nrow(x)-h+1]
  test <- window(x,start=test.start)
  fit <- lm(model, data=train)
  my.fcast <- forecast(fit,test)   #no error
}

【问题讨论】:

    标签: r


    【解决方案1】:

    看起来这是forecast.lm 中的一个错误,它来自这个表达式:

    if (!is.null(object$data)) 
        origdata <- object$data
    else if (!is.null(object$call$data)) 
        origdata <- object$data <- eval(object$call$data)
    else origdata <- as.data.frame(fitted(object) + residuals(object))
    

    eval 调用似乎在做一些奇怪的事情,如 ?sys.parent 中所述:

    严格来说,sys.parent 和 parent.frame 指的是上下文 父解释函数。所以内部功能(可能或可能 未设置上下文,因此可能会或可能不会出现在调用堆栈上)可能 不算数,S3 方法也能做出令人惊奇的事情。

    您的函数的快速修复是将数据设置到 lm 对象中以避免eval 调用:

    fcast <- function(a,b,df,h) {
      model <- paste(a,'~',b)
      x <- ts(data=df)  
      train.end <- time(x)[nrow(x)-h]
      test.start <- time(x)[nrow(x)-h+1]
      train <- window(x,end=train.end)
      test <- window(x,start=test.start)
      fit <- lm(model, data=train)
      fit$data <- train
      my.fcast <- forecast(fit,test)
    }
    

    【讨论】:

    • 做到了!非常感谢您的修复。
    • 如果此答案有效,请不要忘记接受它(单击灰色复选标记)。您还可以为有帮助的答案投票。
    【解决方案2】:

    除了@James 的回答。您的模型未正确定义。参数model &lt;- paste(a,'~',b) 在数据集中的所有数字之间放置一个~

    最好将model 简单地定义为函数中的参数。如:

    fcast <- function(model,df,h) { #define model outside of the function
      #model <- paste(a,'~',b) #commented out
      x <- ts(data=df)  
      train.end <- time(x)[nrow(x)-h]
      test.start <- time(x)[nrow(x)-h+1]
      train <- window(x,end=train.end)
      test <- window(x,start=test.start)
      fit <- lm(model, data=train)
      my.fcast <- forecast(fit,test)   #error object 'train' not found -> see @James' answer
    }
    

    这意味着你的函数看起来像:

    fcast(a~b,df,h)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      相关资源
      最近更新 更多