gpt4 book ai didi

r - 如何为 R 中向量中的每个元素创建一个闭包?

转载 作者:行者123 更新时间:2023-12-05 00:24:20 25 4
gpt4 key购买 nike

在 R 中,我试图为向量的每个元素创建一个闭包,并让它在运行时访问该特定元素。

我有一个值向量:

the.vector <- c('a', 'b', 'c')

如果我运行一个迭代向量的函数,运行一个返回每个元素的简单函数,最终结果将是 list('a', 'b', 'c') .它看起来像这样(为简洁起见,简化了输出):
Test1 <- function() {
lapply(the.vector, function(element) {
element
})
}

Test1()
list('a', 'b', 'c')

现在,如果我迭代向量,创建一个访问每个元素的闭包,然后迭代它并运行每个闭包,结果是 list('c', 'c', 'c') (!)。它看起来像这样:
Test2 <- function () {
closures <- lapply(the.vector, function(element) {
function() {
element
}
})
lapply(closures, function(closure) {
closure()
})
}

Test2()
list('c', 'c', 'c')

总之:我希望内部闭包引用每个元素,以便 Test2 的结果与 Test1 相同.

我很确定这是由于 R 解析变量名称的方式,因为它进行词法范围界定;我可能会以一种动态范围界定的方式来处理它。但是,这并不能解决我的问题,我不知道该怎么做。

达到预期结果的最佳方法是什么?

最佳答案

问题是在您的 Test2 应用循环中,您实际上并没有使用变量 element所以它仍然是一个“ promise ”,当你运行函数时,当这个 promise 最终得到解决时,你会得到该变量的最后一个已知值,即“c”。解决此问题的最简单方法是使用 force()功能

Test2 <- function () {
closures <- lapply(the.vector, function(element) {
force(element)
function() {
element
}
})
lapply(closures, function(closure) {
closure()
})
}

关于r - 如何为 R 中向量中的每个元素创建一个闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26446534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com