3

有人可以解释一下为什么下面的代码片段会这样吗?

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 函数到底是做什么的?

先感谢您,

阿德里安

4

2 回答 2

7

惰性求值通常会导致返回循环中的最后一次求值。试试这个:

AddFn <- function(str) { force(str); l[[length(l) + 1]] <<- function() { return(str) }}
于 2012-05-13T21:19:30.183 回答
7

这是一个讨厌的。该str参数被设置为一个表示返回的承诺letter,但直到通过调用它才真正被评估l[[3]]()。所以使用了那个时候的值!

如果将最后一部分更改为:

for (letter in letters) AddFn(letter)
letter="foo" 
l[[3]]()  # Returns "foo"

……你会看得更清楚。...所以按照@DWin 的建议做,然后force先打电话。

于 2012-05-13T21:24:52.943 回答