首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R6对象中使用memoise

在R6对象中使用memoise
EN

Stack Overflow用户
提问于 2017-11-25 05:02:09
回答 1查看 135关注 0票数 0

全,

我是R6的新手。我正在尝试创建一个私有对象,该对象通过memoise函数进行缓存。背景的想法是这个对象将通过计算密集型计算来定义,我希望避免在第一次之后重新运行。

我正在尝试复制以下行为:

代码语言:javascript
复制
library(R6)
library(memoise)
library(digest)

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


Test(1)
Test(1)

您应该注意到,第一个Test(1)需要运行一到两个时间,而第二个Test(1)是即时的。

我在R6世界的MWE是:

代码语言:javascript
复制
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看起来像:

代码语言:javascript
复制
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中变得复杂。

EN

回答 1

Stack Overflow用户

发布于 2018-02-06 21:09:17

下面的方法对我来说很有效。您只需自己实现缓存即可

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47479972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档