2015-11-05 31 views
2

我希望apply函数调用的函数在全局范围内有副作用,即影响全局范围内的变量。这不起作用,你可以看到:如何获得应用功能有副作用?

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)被称为不幸的测试仍是1rollapply被执行后。有可能解决这个问题吗?

+0

不是'NULL + 1'给出'numeric(0)'? – 2015-11-05 07:43:27

+0

您可以使用'<< - '赋值参数来做到这一点,但这不是一种好的做法。 – Heroka

+0

'assign'接受环境参数,'<< - '搜索所有的父框架,直到到达全局框架,如果它没有找到,它将分配一个新的值。 – jenesaisquoi

回答

3

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

然而,使用<<-操作您覆盖此行为:

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

然而,如果这种不正常需要和气馁。

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