r - 无环境序列化闭包

标签 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。我非常确定它的制作环境也是序列化的。但我不需要它的环境。我只需要闭包及其内容。

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

最佳答案

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

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

关于r - 无环境序列化闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47275968/

相关文章:

r - 如何创建一个以 FUN 作为参数的 R 函数

java - 为什么 rJava 不能在使用 OpenJDK 7 的 Ubuntu 14.04 上运行?

r - 按 R 中的元素拆分字符向量?

javascript - forEach 无法读取新节点元素 - js

引用外部对象的 Javascript 作用域

c# - 在闭包中捕获 TextReader 但仍然正确处理它的好方法是什么?

r - data.table - 检查一列是否在另一(列表)列中

r - gitbook 代码块中出现丑陋的深色条纹,突出显示 : espresso (R bookdown)

api - swift 中具有多个闭包/API 请求的函数中的异步完成处理

Javascript:将自定义参数传递给回调函数