【问题标题】:Using memoise in R6 objects在 R6 对象中使用 memoise
【发布时间】: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 错误是由于范围界定造成的,而privateR6 会变得复杂。

【问题讨论】:

    标签: r oop r6 memoise


    【解决方案1】:

    以下内容对我很有效。您只需要自己实现缓存

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-04
      • 2018-06-06
      • 2021-05-26
      相关资源
      最近更新 更多