我想在一个包中创建一个带有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实例而不尝试加载命名空间?
答案 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道歉,但我没有编辑链接,虽然我发布了这个问题,也没有任何地方让我留下“评论”,就像我有这个大文本字段一样回答。我已经标记了这个以便审核,所以我可以得到一些帮助,并参考了常见问题解答,其中讨论了我没有留下评论的按钮。这个新帐户存在一些问题。