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

时间:2010-10-29 04:41:15

标签: r

我想在一个包中创建一个带有NAMESPACE的函数,该函数将save一些变量。问题是在.Rdata文件上调用load时 尝试加载包含创建.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失败,因为它无法加载这个。

是否有可能在我.GLOBAL.FUN之前将命名空间从save中完全删除,以便可以将其加载到其他R实例而不尝试加载命名空间?

1 个答案:

答案 0 :(得分:0)

@JorisMeys降雪,其他人没有提供这种功能。

降雪使用sfExport(来自降雪中的clusterFunctions.R)将本地和全局对象导出到从属节点,然后使用sfClusterCall,它是来自snow的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道歉,但我没有编辑链接,虽然我发布了这个问题,也没有任何地方让我留下“评论”,就像我有这个大文本字段一样回答。我已经标记了这个以便审核,所以我可以得到一些帮助,并参考了常见问题解答,其中讨论了我没有留下评论的按钮。这个新帐户存在一些问题。