R 一种不太敏感的序列化方法 背景

R 一种不太敏感的序列化方法 背景,r,serialization,R,Serialization,该软件包类似于面向R的数据科学项目。它检测依赖关系的变化,以决定是否构建下游目标。上游最远的依赖项通常是用户定义的函数、类等。要检测更改,依赖于序列化和哈希 问题 出于的目的,对于包含函数的对象,序列化过于敏感。例如,当我调用一个方法时,即使类本身没有以任何有意义的方式更改,类的内部也会更改。正如Winston Chang有益地指出的,serialize()对琐碎的记录保存(通过.Internal(inspect())可见)反应过度 库(摘要) 图书馆(R6) 某些类作为解决方案,您可以将R6类

该软件包类似于面向R的数据科学项目。它检测依赖关系的变化,以决定是否构建下游目标。上游最远的依赖项通常是用户定义的函数、类等。要检测更改,依赖于序列化和哈希

问题 出于的目的,对于包含函数的对象,序列化过于敏感。例如,当我调用一个方法时,即使类本身没有以任何有意义的方式更改,类的内部也会更改。正如Winston Chang有益地指出的,
serialize()
对琐碎的记录保存(通过
.Internal(inspect())
可见)反应过度

库(摘要)
图书馆(R6)

某些类作为解决方案,您可以将
R6
类定义封装在函数中:

禁止收尾:

library(drake)
library(digest)
library(R6)
some_class <- R6Class(
  "some_class",
  private = list(x = NULL),
  public = list(
    initialize = function(x) {
      private$x <- x
    }
  )
)

plan <- drake_plan(
  new_obj = some_class$new(x = 10)
)
收尾时:

new_object <- function(x) {
  some_class <- R6Class(
    "some_class",
    private = list(x = NULL),
    public = list(
      initialize = function(x) {
        private$x <- x
      }
    )
  )
  some_class$new(x = x)
}

plan <- drake_plan(
  new_obj = new_object(10)
)
make(plan)
> target new_obj
make(plan)
> target new_obj
new_object <- function(x) {
  some_class <- R6Class(
    "some_class",
    private = list(x = NULL),
    public = list(
      initialize = function(x) {
        private$x <- x
      }
    )
  )
  some_class$new(x = x)
}

plan <- drake_plan(
  new_obj = new_object(10)
)
make(plan)
> target new_obj
make(plan)
v All targets are already up to date.