重复调用后闭包更改的 R 摘要
R digest of closure changes after repeated call
我试图记忆一个在相当复杂的闭包上运行的 R 函数,发现重复调用记忆函数会在检索缓存结果之前计算两次结果,而不是仅在第一次调用时计算结果。
我认为有几件事导致了它,但这个问题集中在我试图理解的第一个问题上。
我的闭包本质上是一个函数列表:
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"
但是第三次做的结果是"stabilised":
f <- foo()
digest::digest(f) # no change in hash
[1] "180471cb687f12271c8ba7800d02695c"
我已经阅读了很多关于环境如何使用闭包(创建共享可变状态、限制在封闭环境中可见的引用等)的文章,但我仍然对这个看似简单的问题摸不着头脑!
为什么 digest 在第二次调用时产生不同的输出?
朋友帮我解决了这个问题。
此行为是字节码编译器在第二次调用 foo()
时对闭包进行操作的结果。
在第一次调用之前显式编译函数解决了问题:
bar <- compiler::cmpfun(foo)
我试图记忆一个在相当复杂的闭包上运行的 R 函数,发现重复调用记忆函数会在检索缓存结果之前计算两次结果,而不是仅在第一次调用时计算结果。
我认为有几件事导致了它,但这个问题集中在我试图理解的第一个问题上。
我的闭包本质上是一个函数列表:
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"
但是第三次做的结果是"stabilised":
f <- foo()
digest::digest(f) # no change in hash
[1] "180471cb687f12271c8ba7800d02695c"
我已经阅读了很多关于环境如何使用闭包(创建共享可变状态、限制在封闭环境中可见的引用等)的文章,但我仍然对这个看似简单的问题摸不着头脑!
为什么 digest 在第二次调用时产生不同的输出?
朋友帮我解决了这个问题。
此行为是字节码编译器在第二次调用 foo()
时对闭包进行操作的结果。
在第一次调用之前显式编译函数解决了问题:
bar <- compiler::cmpfun(foo)