我希望应用函数调用的函数在全局范围内具有副作用,即影响全局范围中的变量。如您所见,这不起作用:
library(zoo)
test=1
rollapply(1:10, width=2, function(x) test=test+1)
# [1] NA NA NA NA NA NA NA NA NA
test
# 1
我希望测试每次function(x)
被调用时都会增加,但遗憾的是,1
执行后测试仍然是rollapply
。有可能解决这个问题吗?
答案 0 :(得分:5)
通常,R不支持在函数范围之外更改变量。这样做的原因是减少代码的互连性。这是一件好事,因为它可以更容易地推断出特定的代码片段正在做什么,而不必考虑它周围的所有上下文。特别是在较大的程序中,这可能会很难修复错误。
但是,使用<<-
运算符会覆盖此行为:
a = 1
spam = function() {
a <<- a + 1
}
spam()
a
[1] 2
然而,这通常不需要和劝阻。
通常,函数不保持状态,即一旦函数完成,函数内的所有信息都将被丢弃。看看closures以获取保持状态的函数,这可能会解决您的问题(您没有说明)。