我使用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。我很确定它的环境也是序列化的。但我不需要它的环境。我只需要关闭及其内容。
我做错了吗?我是以错误的方式初始化或定义闭包吗?我怎样才能使它只是序列化闭包而不是其他环境?从某些包中序列化闭包没有这种效果,我找不到罪魁祸首。
答案 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。