背景
drake
package 就像 Make for R-focused 数据科学项目。它检测依赖项的变化来决定是否构建下游目标。最上游的依赖项通常是用户定义的函数, R6
类等。要检测更改, drake
依赖于序列化和散列。
问题
对于 drake
的目的,当涉及到包含函数的对象时,序列化过于敏感。例如,当我调用 R6
时方法,即使类本身没有以任何有意义的方式改变,类的内部结构也会发生变化。正如 Winston Chang 帮助指出的那样here , serialize()
对琐碎的记录 react 过度(可见 .Internal(inspect())
)。
library(digest)
library(R6)
some_class <- R6Class(
"some_class",
private = list(x = NULL),
public = list(
initialize = function(x) {
private$x <- x
}
)
)
digest(some_class)
#> [1] "8ae94b2fe26264ca68eb39da640da5a1"
object <- some_class$new(123)
digest(some_class)
#> [1] "c4cc5a51c85cb2e4a773cf6e29684f7d"
object <- some_class$new(123)
digest(some_class)
#> [1] "f94260c269920b53db838d2fcf53271f"
object <- some_class$new(123)
digest(some_class)
#> [1] "f94260c269920b53db838d2fcf53271f"
object <- some_class$new(123)
问题
最佳答案
作为解决方案,您可以结束 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.
关于r - 一种不太敏感的序列化方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50969627/