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

时间:2018-06-21 13:21:05

标签: r serialization

背景

drake软件包就像Make专注于R的数据科学项目。它检测依赖关系的变化,以决定是否构建下游目标。最上游的依赖项通常是用户定义的函数,R6类等。要检测更改,drake依赖于序列化和哈希处理。

问题

出于drake的目的,对于包含函数的对象,序列化过于敏感。例如,当我调用R6方法时,即使类本身没有任何有意义的更改,该类的内部也会发生变化。正如Winston Chang指出here时一样,headers对琐碎的记录保持反应过度(在serialize()可见)。

.Internal(inspect())

问题

  1. 是否有办法从序列化和/或散列中排除琐碎的内部结构?
  2. 如果我需要实现自定义序列化方法,那么有哪些好的资源可用于学习序列化和我需要访问的内部信息?

1 个答案:

答案 0 :(得分:1)

作为解决方法,您可以将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)
)
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.