如何获得应用功能有副作用?

时间:2015-11-05 07:40:47

标签: r apply side-effects

我希望应用函数调用的函数在全局范围内具有副作用,即影响全局范围中的变量。如您所见,这不起作用:

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。有可能解决这个问题吗?

1 个答案:

答案 0 :(得分:5)

通常,R不支持在函数范围之外更改变量。这样做的原因是减少代码的互连性。这是一件好事,因为它可以更容易地推断出特定的代码片段正在做什么,而不必考虑它周围的所有上下文。特别是在较大的程序中,这可能会很难修复错误。

但是,使用<<-运算符会覆盖此行为:

a = 1
spam = function() {
    a <<- a + 1
}
spam()
a
[1] 2

然而,这通常不需要和劝阻。

通常,函数不保持状态,即一旦函数完成,函数内的所有信息都将被丢弃。看看closures以获取保持状态的函数,这可能会解决您的问题(您没有说明)。