我试图记忆一个在一个相当复杂的闭包上运行的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在第二次调用时产生不同的输出?
答案 0 :(得分:0)
一位朋友帮我解决了这个问题。
这种行为是字节码编译器在第二次调用foo()
时对闭包进行操作的结果。
在第一次调用解决问题之前显式编译函数:
bar <- compiler::cmpfun(foo)