Jua*_*oto 4 closures loops r lapply
在R中,我试图为向量的每个元素创建一个闭包,并让它在运行时访问该特定元素.
我有一个值向量:
the.vector <- c('a', 'b', 'c')
Run Code Online (Sandbox Code Playgroud)
如果我运行一个迭代向量的函数,运行一个返回每个元素的简单函数,最终的结果就是list('a', 'b', 'c').它看起来像这样(为简洁起见,简化了输出):
Test1 <- function() {
lapply(the.vector, function(element) {
element
})
}
Test1()
list('a', 'b', 'c')
Run Code Online (Sandbox Code Playgroud)
现在,如果我迭代向量,创建一个访问每个元素的闭包,然后遍历它并运行每个闭包,结果是list('c', 'c', 'c')(!).它看起来像这样:
Test2 <- function () {
closures <- lapply(the.vector, function(element) {
function() {
element
}
})
lapply(closures, function(closure) {
closure()
})
}
Test2()
list('c', 'c', 'c')
Run Code Online (Sandbox Code Playgroud)
总结:我希望内部闭包引用每个元素,以便结果Test2相同Test1.
我很确定这是由于R解析变量名的方式,因为它确实是词法范围; 我可能会采用动态范围的方式来解决这个问题.但是,这并没有解决我的问题,我不知道该怎么做.
达到预期结果的最佳方法是什么?
问题是,在你的Test2应用循环中,你实际上并没有使用变量,element所以它仍然是一个"承诺",当你运行函数时最终解决了这个承诺时,你得到该变量的最后一个已知值,即"c" ".解决此问题的最简单方法是使用该force()功能
Test2 <- function () {
closures <- lapply(the.vector, function(element) {
force(element)
function() {
element
}
})
lapply(closures, function(closure) {
closure()
})
}
Run Code Online (Sandbox Code Playgroud)