在for循环中追加函数结果

时间:2016-07-11 04:46:14

标签: r

不是一个可重现的例子,但这是我的问题。我有一个数据框,正在循环一系列列并执行预测。我已经创建了一个函数来处理预测部分,因为它是重复的并将它放在for循环中。因此,循环的每次迭代,forecast_func循环将用于执行预测和准确性评估,并将这些结果与结果数据框进行比较。

result = data.frame()
forecast_func = function(data){
    data.train = rnorm(100)
    data.test = rnorm(10)
    library(forecast)
    mod = auto.arima(data.train)
    mod_forc = forecast(mod)$mean
    mod_acc = accuracy(mod_forc, data.test)
    result = rbind(result, data.frame(mod_forc))
}
result

for(i in ...){
  ...
  forecast_func(data)  
  ...
}

如果我这样做一次,我知道如何将结果追加到结果中。但是,在for循环中,每次使用该函数时,都会得到一个空数据帧。显然,它不会回归全球环境。但是,我想知道解决这个问题的有用策略是什么。

1 个答案:

答案 0 :(得分:2)

我相信你可以在这里使用父作业运算符(<<-):

forecast_func = function(data){
    data.train = rnorm(100)
    data.test = rnorm(10)
    library(forecast)
    mod = auto.arima(data.train)
    mod_forc = forecast(mod)$mean
    mod_acc = accuracy(mod_forc, data.test)
    # assign to 'result' data frame in the parent (calling) scope
    result <<- rbind(result, data.frame(mod_forc))
}

result = data.frame()

for (i in ...) {
  ...
  forecast_func(data)  
  ...
}

这就是说,根据我在SO和其他地方看到的内容,使用父赋值运算符通常是不受欢迎的。

避免使用<<-的一种方法是重构forecast_func以返回数据框,而不是尝试在内部持久保存结果:

forecast_func = function(data){
    data.train = rnorm(100)
    data.test = rnorm(10)
    library(forecast)
    mod = auto.arima(data.train)
    mod_forc = forecast(mod)$mean
    mod_acc = accuracy(mod_forc, data.test)

    return(data.frame(mod_forc))
}

result = data.frame()

for (i in ...) {
  ...
  # just rbind() here in the calling scope
  result = rbind(result, forecast_func(data))
  ...
}