首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >恢复R6对象

恢复R6对象
EN

Stack Overflow用户
提问于 2022-07-07 10:46:07
回答 1查看 83关注 0票数 8

假设我有一个简单的抽象R6类。

代码语言:javascript
复制
myClass <- R6::R6Class(
  classname = "myClass",
  public = list(
    save = function(path) {
      saveRDS(self, path)
    },
    load = function(path) {
      object <- readRDS(path)
      self <- object
      lockEnvironment(self)
      invisible(self)
    }
  )
)

然后我有个孩子课做一些事情

代码语言:javascript
复制
myChildClass <- R6::R6Class(
  classname = "myChildClass",
  inherit = myClass,
  lock_objects = FALSE,
  public = list(
    initialize = function(x) {
      private$x <- x
    },
    addOne = function() {
      private$x <- private$x + 1
      private$x
    }
  ),
  private = list(x = NA_real_)
)

我想要做的是能够保存我创建的类,然后在以后恢复它。

代码语言:javascript
复制
tmp <- myChildClass$new(x = 10)
tmp$addOne()
tmp$addOne()
tmpFile <- tempfile()
tmp$save(tmpFile)
new <- myClass$new()
new$load(tmpFile)
new
# <myClass>
#   Public:
#     clone: function (deep = FALSE)
#     load: function (path)
#     save: function (path)

我遇到的问题是,由于某种原因,当我们调用self时,实际上并没有更新$load()。如果我调试这个方法,我会发现它确实被覆盖了,但是对象new仍然返回初始的myClass对象,而没有加载的更改。唯一的方法,我似乎可以让它做我想做的是通过重新分配输出(显然)。

代码语言:javascript
复制
new <- myClass$new()
new <- new$load(tmpFile)
new
# <myChildClass>
#   Inherits from: <myClass>
#   Public:
#     addOne: function ()
#     clone: function (deep = FALSE) 
#     initialize: function (x)
#     load: function (path)
#     save: function (path)
#   Private:
#     x: 12

现在我明白了,我可以只使用readRDS()并完成它,但是我希望它是可链接的,因此尝试将它放在一个方法中。

EN

回答 1

Stack Overflow用户

发布于 2022-08-04 13:10:36

活动绑定可用于直接调用load

代码语言:javascript
复制
parent <- R6::R6Class(
    classname = "parent",
    public = list(
        # update path if supplied in new()
        initialize = function(path = NULL) if(!is.null(path)) self$path <- path,
        path = NULL,
        save = function(path) {
            saveRDS(self, path)
        },
        load = function(path) {
            object <- readRDS(path)
            self <- object
            lockEnvironment(self)
            invisible(self)
        }
    ),
    active = list(
        file = function() self <- self$load(self$path) # computed at each access
    )
)
child <- R6::R6Class(
    classname = "child",
    inherit = parent,
    lock_objects = FALSE,
    public = list(
        initialize = function(x) {
            private$x <- x
        },
        addOne = function() {
            private$x <- private$x + 1
            private$x
        }
    ),
    private = list(x = NA_real_)
)

tmp1 <- child$new(x = 10)
tmp1$addOne() # 11
tmpFile <- tempfile() #tmp nr 1
tmp1$save(tmpFile)

tmp2 <- parent$new(tmpFile)$file
tmp2$addOne() # 12
tmpFile2 <- tempfile()
tmp2$save(tmpFile2)

tmp3 <- parent$new(tmpFile2)$file
tmp3

#> <child>
#>   Inherits from: <parent>
#>   Public:
#>     addOne: function () 
#>     clone: function (deep = FALSE) 
#>     file: active binding
#>     initialize: function (x) 
#>     load: function (path) 
#>     path: NULL
#>     save: function (path) 
#>   Private:
#>     x: 12

这样,新的父级就可以放在链中。

代码语言:javascript
复制
parent$new(tmpFile2)$file$addOne()
[1] 13

以及来自?makeActiveBinding的相关警告

当前,在包安装期间没有保留活动绑定,但是可以在.onLoad中创建它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72896437

复制
相关文章

相似问题

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