我正在使用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
环境。有关相关主题,另请参阅此处。