【发布时间】:2018-05-08 20:44:25
【问题描述】:
全部,
我是 R6 的新手。
我正在尝试创建一个通过 memoise 函数缓存的私有对象。背景想法是这个对象将通过计算密集型计算来定义,我希望避免在第一次之后重新运行。
我正在尝试复制以下行为:
library(R6)
library(memoise)
library(digest)
Test <- memoise(function(x){
rnorm(1e8)
})
Test(1)
Test(1)
您应该观察到第一个Test(1) 需要一两秒才能运行,而第二个Test(1) 是即时的。
我在 R6 世界中的 MWE 是:
factory <- R6Class("Test",
private = list(
..Z = memoise(
function(x){
rnorm(1e8)
}
)
),
active = list(
Z = function(value){
private$..Z(x=1)
}
)
)
object <- factory$new()
object$Z
这应该显示rnorm(1e8),但我得到了错误:
Error in private$..Z() : object 'cache' not found
快速编辑我的对象让我知道,在后台,..Z 看起来像:
function (...)
{
hash <- digest(list(...))
if (cache$has_key(hash)) {
cache$get(hash)
}
else {
res <- f(...)
cache$set(hash, res)
res
}
}
看来我在设置memoise 时没有成功。看了上面的内容,我不是 100% 清楚 memoise 是如何工作的——如果我看不到缓存,它是如何存在的?通常not found 错误是由于范围界定造成的,而private 和R6 会变得复杂。
【问题讨论】: