2015-11-14 130 views
2

我最近遇到了一些意想不到[R的行爲,它可以以最簡單的形式,用下面的代碼被複制:一個R函數封閉環境

make.adder <- function(a) {function(x) {x + a}} 
s <- list(1, 2) 
adders <- lapply(s, make.adder) 

我們現在所期望的加法器[1]是一個函數這增加了1,並且加法器[[2]]是它增加了2。然而的函數,

adders[[1]](1) 

返回3(當我們可能已經預期2)。採取看看環境

environment(adders[[1]])$a 

回報2,這是令人驚訝的再次(但一致的)。這裏發生了什麼?

我們看到類似的行爲,如果我們嘗試改用for循環:

adders <- list() 
for (i in seq(1, 2)) {adders[[i]] <- make.adder(i)} 

同樣,加法器[1](1)返回3.我們如何可以創建100個函數列表,例如第i個函數是make.adder(i)?

+2

嘗試R. –

+1

的最新版本,並嘗試了這個問題http://stackoverflow.com/questions/16129902/explain-a-lazy-evaluation-quirk – rawr

+0

而閱讀[這裏](http://adv-r.had.co.nz/Functions.html#function-arguments)我可能會添加幾乎完全包含該示例。 – joran

回答

2

我想你需要使用force()來確保參數在你期望的時候被評估。見?force更多信息...

make.adder <- function(a) { force(a); function(x) {x + a}} 
s <- list(1, 2) 
adders <- lapply(s, make.adder) 

adders[[1]](1) ## 2