R重复调用后的闭包消化变化

时间:2017-12-15 03:28:21

标签: r closures environment memoization digest

我试图记忆一个在一个相当复杂的闭包上运行的R函数,并发现重复调用memoised函数会在检索缓存结果之前计算两次结果,而不是仅在第一次调用时计算它。

我认为有一些事情正在发生,但是这个问题集中在我试图理解的第一个问题上。

我的闭包本质上是一个函数列表:

foo <- function() {
  bar <- function() NULL
  list(bar = bar)
}

创建foo实例,并运行digest:

f <- foo()
digest::digest(f)
[1] "5a54945202730e8c997aa41a27d23dd5"

再次实例化f会导致摘要的输出不同:

f <- foo()
digest::digest(f) # different hash
[1] "180471cb687f12271c8ba7800d02695c"

但第三次这样做表明结果已经稳定了&#34;:

f <- foo()
digest::digest(f) # no change in hash
[1] "180471cb687f12271c8ba7800d02695c"

我已经阅读了很多关于环境如何处理闭包(创建共享可变状态,限制在封闭环境中可见的引用等)的内容,但我仍然对这个看似简单的问题感到头疼!

为什么digest在第二次调用时产生不同的输出?

1 个答案:

答案 0 :(得分:0)

一位朋友帮我解决了这个问题。

这种行为是字节码编译器在第二次调用foo()时对闭包进行操作的结果。

在第一次调用解决问题之前显式编译函数:

bar <- compiler::cmpfun(foo)