在R中的NAMESPACE中创建和序列化/保存全局变量

我想在一个包含NAMESPACE的包中创建一个函数,它将save一些变量。 问题是,当load被呼吁.Rdata文件,它会尝试加载包含创建该.Rdata文件中的函数包的命名空间,但是这个包不需要加载。

这个示例函数位于命名空间的一个包中:

create.global.function <- function(x, FUN, ...) {
 environment(FUN) <- .GlobalEnv
 assign(".GLOBAL.FUN", function(x) { FUN(x, ...) }, env=.GlobalEnv)
 environment(.GLOBAL.FUN) <- .GlobalEnv
 save(list = ls(envir = .GlobalEnv, all.names = TRUE),
      file = "/tmp/.Rdata",
      envir = .GlobalEnv)
}

environment(.GLOBAL.FUN) <- .GlobalEnv调用是不够的,并且将gdb附加到R进程确认它正在将此处的NAMESPACESXP与包名称空间的名称序列化,并且load因为无法load失败。

在我save之前,是否可以将.GLOBAL.FUN的命名空间完全剥离,以便可以在不尝试加载命名空间的情况下将其加载到其他R实例中?


@JorisMeys降雪和其他人不提供这种功能。

降雪使用sfExport(来自clusterFunctions.R的降雪)将本地和全局对象导出到从属节点,并且这反过来使用sfClusterCall,它是来自积雪的clusterCall函数的包装。

res <- sfClusterCall( assign, name, val, env = globalenv(),
                      stopOnError = FALSE )

如果我在我的问题的最后一句中提到我不想在那里加载名称空间,那么在客户端绕过任何命名空间问题时,会加载雪库。

此外,它似乎做了简化的假设,例如节点将共享共享数据的NFS挂载点(例如clusterFunctions.R中的sfSource函数)。

我更喜欢类似于节点保存.Rdata文件然后将scp保存到另一个不需要加载包名称空间的节点的情况。

看来我现在可以通过使用eval.parent解决我的原始问题,并替代:

 assign(".GLOBAL.FUN",
         eval.parent(substitute(function(y) { FUN(y, ...) })),
         env=.GlobalEnv)

我很抱歉张贴snafu,但我没有编辑链接,虽然我发布了这个问题,也没有任何地方让我留下“评论”,就像我有这个大文本字段的答案一样。 我已将此举标记为适度,以便我可以获得一些帮助,并引用了常见的按钮说明问题,这些按钮并不适合我留言。 这个新帐户存在一些问题。

链接地址: http://www.djcxy.com/p/38331.html

上一篇: Creating and serializing / saving global variable from within a NAMESPACE in R

下一篇: Use of gsub function to clean a column in a data frame in R