我在哪里错过了什么?
FUN<-list()
make.FUN<-function(i) function(n) i+n
for (i in 1:3) FUN[[i]]<-make.FUN(i)
FUN[[1]](1)
如果我检查 FUN 分配,我会得到一个嵌套函数的引用(如预期的那样):
> FUN
[[1]]
function (n)
i + n
<environment: 0x03adfad0>
[[2]]
function (n)
i + n
<environment: 0x03ae0834>
[[3]]
function (n)
i + n
<environment: 0x03ae0604>
>
问题是,如果我检查:
> FUN[[1]](1)
[1] 4
>
当我期待2!(显然它正在覆盖最后一个值)
另一方面,如果我为列表的每个元素手动分配:
FUN[[1]]<-make.FUN(1)
FUN[[2]]<-make.FUN(2)
FUN[[3]]<-make.FUN(3)
我得到正确答案:
> FUN[[1]](1)
[1] 2
> FUN[[2]](3)
[1] 5
>
我可以使用 do.call 来解决问题,但我无法意识到解释器在第一个循环中假设了什么,或者为什么在这种情况下 do.call 是强制性的。当我尝试:
FUN<-list()
make.FUN<-function(i) function(n) i+n
for (i in 1:3) FUN[[i]]<-do.call('make.FUN',list(i))
我得到(如预期的那样):
> FUN[[1]](2)
[1] 3
有什么线索吗?(仅在使用列表时发生)