【问题标题】:How to create one closure for each of the elements in a vector in R?如何为 R 中向量中的每个元素创建一个闭包?
【发布时间】:2014-12-14 07:22:11
【问题描述】:

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

我有一个值向量:

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

如果我运行一个迭代向量的函数,运行一个返回每个元素的简单函数,最终结果将是list('a', 'b', 'c')。它看起来像这样(为简洁起见,输出被简化):

Test1 <- function() {
  lapply(the.vector, function(element) {
    element
  })
}

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

现在,如果我遍历向量,创建一个访问每个元素的闭包,然后遍历 that 并运行每个闭包,结果是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 解析变量名的方式,因为它是词法范围;我可能会以动态范围界定的方式来处理它。但是,这并不能解决我的问题,我不知道该怎么做。

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

【问题讨论】:

    标签: r loops closures lapply


    【解决方案1】:

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

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

    【讨论】:

    • 哇。棒极了!我很想了解更多有关这方面的信息。你知道我可以找到更多参考资料吗?非常感谢!
    • Promise 被讨论了一点 here 并且您肯定会发现该指南的其余部分也很有用。
    猜你喜欢
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 2021-07-16
    • 1970-01-01
    相关资源
    最近更新 更多