全,
我是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中变得复杂。
发布于 2018-02-06 21:09:17
下面的方法对我来说很有效。您只需自己实现缓存即可
library(R6)
library(digest)
factory <- R6Class(
"Test",
private = list(
cache = list(),
..Z = function(x){
hash <- digest(x)
if (hash %in% names(private$cache)) {
private$cache[[hash]]
}
else {
res <- rnorm(1e7, x)
private$cache[[hash]] <- res
res
}
}
),
active = list(
Z = function(value){
private$..Z(x=1)
}
)
)
object <- factory$new()
## takes a while
object$Z
## returns "instantly"
object$Zhttps://stackoverflow.com/questions/47479972
复制相似问题