2017-11-24 3 views
0

すべて、R6オブジェクトにmemoiseを使用

私は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のエラーはスコープによるもので、privateR6で複雑になります。

答えて

0

以下は私にとってはうまくいきます。自分でキャッシングを実装するだけで済みます

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$Z 
関連する問題