我已经定义了一个匿名函数列表,这些函数使用在外部范围中定义的变量。
funclist <- list()
for(i in 1:5)
{
funclist[[i]] <- function(x) print(i)
}
funclist[[1]]('foo')
输出是:
[1] 5
看来我 通过引用捕获。我希望它被值(value)捕获,即输出应该是
[1] 1
有没有办法告诉 R 捕获 我 按值(value)而不是按引用?
最佳答案
当您运行 for
循环,这将在循环运行的环境中创建一个变量,并且在循环中创建的函数也从该环境运行。因此,每当您运行以这种方式创建的使用循环中的索引值的函数时,它们只能访问最终值,并且只要该变量仍然存在(尝试 rm(i)
并尝试在名单)。
您需要做的是将索引值绑定(bind)到自己环境中的函数。 lapply
会自动为您执行此操作。但是,惰性评估存在一个问题。你要做的也是force
评价i
在创建匿名函数之前:
funclist <- lapply(1:5, function(i) {force(i); function(x) print(i)})
funclist[[1]]('foo')
[1] 1
funclist[[5]]('foo')
[1] 5
关于R匿名函数: capture variables by value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16216909/