不是一个可重现的例子,但这是我的问题。我有一个数据框,正在循环一系列列并执行预测。我已经创建了一个函数来处理预测部分,因为它是重复的并将它放在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循环中,每次使用该函数时,都会得到一个空数据帧。显然,它不会回归全球环境。但是,我想知道解决这个问题的有用策略是什么。
答案 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))
...
}