2015-11-05 63 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來獲得保持狀態的函數,這可能會解決你的問題(你沒有說明)。