2017-11-24 16 views
0

모두,R6 개체에 memoise 사용

R6.0의 새로운 기능입니다. memoise 함수를 통해 캐시 된 개인 개체를 만들려고합니다. 배경 아이디어는이 객체가 계산 집약적 인 계산에 의해 정의 될 것이고, 처음으로 다시 실행하는 것을 피하고자합니다.

나는 다음과 같은 동작을 복제하는 것을 시도하고있다 : 두 번째 Test(1) 인스턴트 반면

library(R6) 
library(memoise) 
library(digest) 

Test <- memoise(function(x){ 
    rnorm(1e8) 
}) 


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 오류는 범위 지정으로 인해 발생하며 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