无环境地序列化闭包

时间:2017-11-14 00:55:06

标签: r closures

我使用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。我很确定它的环境也是序列化的。但我不需要它的环境。我只需要关闭及其内容。

我做错了吗?我是以错误的方式初始化或定义闭包吗?我怎样才能使它只是序列化闭包而不是其他环境?从某些包中序列化闭包没有这种效果,我找不到罪魁祸首。

1 个答案:

答案 0 :(得分:1)

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

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功能也会复制环境。 A&#34;解决方法&#34;是将闭包的定义放在全球环境中。

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环境。有关相关主题,另请参阅here