在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