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

问题描述 投票:1回答:1

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

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

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

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

创建foo实例,并运行摘要:

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

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

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

但第三次这样做表明结果已“稳定”:

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

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

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

r closures environment memoization digest
1个回答
0
投票

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

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

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

bar <- compiler::cmpfun(foo)
© www.soinside.com 2019 - 2024. All rights reserved.