r语言 - 在没有环境的情况下序列化闭包



我正在使用serialize函数序列化对象。

例如

serialize_object <- serialize(some_object, NULL)

现在我有一个关闭问题。例如:

closure <- function(){
  member <- NULL
  list(init=function(val){member <<- val})
}
closure_serialized <- serialize(closure(), NULL)

这个原始对象closure_serialized很大:大约200MB。我很确定制作它的环境也是序列化的。但我不需要它的环境。我只需要关闭及其内容。

我做错了什么吗?我是否以错误的方式初始化或定义闭包?如何使其仅序列化闭包而不序列化环境的其余部分?从某些包序列化闭包没有这种效果,我找不到罪魁祸首。

这主要是因为闭包的定义在一个函数内。

fn <- function(){
    # make big variables
    closure <- function(){
      member <- NULL
      list(init=function(val){member <<- val})
    }
    closure_serialized <- serialize(closure(), NULL)
}
# serialize will copy the environment within the function in closure_serialized
fn()

在这种情况下,serialize函数也会复制环境。"解决方法"是将闭包的定义放在全局环境中。

closure <- function(){
  member <- NULL
  list(init=function(val){member <<- val})
}
fn <- function(){
    # make big variables
    closure_serialized <- serialize(closure(), NULL)
}
# serialize will not copy the global environment.
fn()

serialize不会复制.GlobalEnv环境。有关相关主题,另请参阅此处。

最新更新