私はR6が初めてです。 memoise
関数でキャッシュされるプライベートオブジェクトを作成しようとしています。背景の考え方は、このオブジェクトは計算集約型の計算で定義されることです。これは最初から再実行しないようにしたいと考えています。
私は、次の動作を複製しようとしています:
library(R6)
library(memoise)
library(digest)
Test <- memoise(function(x){
rnorm(1e8)
})
Test(1)
Test(1)
あなたは二Test(1)
がインスタントであるのに対し、最初Test(1)
は、実行に1秒か2秒を取ることを確認しなければなりません。
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
の設定に失敗したようです。上記を見れば、私はどのようにmemoise
が動作するかについて100%明確ではありません - 私はそれを見ることができない場合、どのようにキャッシュが存在するのですか?通常not found
のエラーはスコープによるもので、private
とR6
で複雑になります。