有人可以解释为什么以下代码段的行为与它一样吗?
l <- list()
AddFn <- function(str) { l[[length(l) + 1]] <<- function() { return(str) }}
AddFn("hello")
AddFn("there")
l[[1]]() # Returns "hello" as expected
l[[2]]() # Returns "there" as expected
for (letter in letters) AddFn(letter)
l[[3]]() # Returns "z"
我希望l[[3]]()
返回“a”。我错过了什么?我的AddFn函数究竟做了什么?
提前谢谢你,
阿德里安
答案 0 :(得分:7)
延迟评估通常会导致返回循环中的最后一次评估。试试这个:
AddFn <- function(str) { force(str); l[[length(l) + 1]] <<- function() { return(str) }}
答案 1 :(得分:7)
这是一个讨厌的人。 str
参数设置为一个承诺,表示返回letter
,但在通过l[[3]]()
调用之前,它实际上不会被评估。因此,使用的值!
如果您将最后一部分更改为:
for (letter in letters) AddFn(letter)
letter="foo"
l[[3]]() # Returns "foo"
......你会更清楚地看到它。
...所以做@DWin的建议并先致电force
。