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

时间:2014-10-19 02:01:01

标签: r loops closures lapply

在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解析变量名的方式,因为它确实是词汇作用域;我可能会采用动态范围的方式来解决这个问题。但是,这并没有解决我的问题,我不知道该怎么做。

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

1 个答案:

答案 0 :(得分:6)

问题是,在你的Test2应用循环中你实际上并没有使用变量element所以它仍然是一个&#34;承诺&#34;当您运行该函数时最终解决了该承诺时,您将获得该变量的最后一个已知值,即&#34; c&#34;。解决此问题的最简单方法是使用force()函数

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