4

我在哪里错过了什么?

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

有什么线索吗?(仅在使用列表时发生)

4

1 回答 1

4

您的问题几乎是force文档中示例的复制粘贴。你需要做:

FUN <- list()
make.FUN <- function(i) { force(i); function(n) i+n }
for (i in 1:3) FUN[[i]] <- make.FUN(i)
FUN[[1]](1)
# [1] 2

相关详情来自?force

force 强制对形式论证进行评估。如果参数将由词法范围规则在闭包中捕获,并且稍后将通过循环或应用函数中的显式赋值或隐式赋值进行更改,这将很有用。

于 2013-05-10T05:09:52.273 回答