【发布时间】:2012-06-27 17:41:47
【问题描述】:
我需要清理一个 R 实例以使其恢复到启动时的原始状态。到目前为止,我正在做的是:
在启动时,记录加载的包和命名空间
original_packages <- grep('^package:', search(), value = TRUE)
original_namespaces <- loadedNamespaces()
当我需要刷新实例时,分离每个在启动时不存在的加载包:
for (pkg in grep('^package:', search(), value = TRUE)) {
if (! pkg %in% original_packages){
detach(pkg, unload=TRUE, force=TRUE, character.only=TRUE)
}
}
问题是,如果我加载了一个包含一堆导入命名空间的包,例如 ggplot2,这些命名空间会保持加载状态,我必须按照导入的顺序从高层向下卸载它们。只是盲目地卸载它们是行不通的,因为我得到“命名空间‘x’是由‘y’导入的,‘z’所以不能卸载”错误。
这是可重现的示例:
original_packages <- grep('^package:', search(), value = TRUE)
original_namespaces <- loadedNamespaces()
library(ggplot2)
library(plyr)
loadedNamespaces()
for (pkg in grep('^package:', search(), value = TRUE)) {
if (! pkg %in% original_packages){
detach(pkg, unload=TRUE, force=TRUE, character.only=TRUE)
}
}
for (ns in loadedNamespaces()) {
if (! ns %in% original_namespaces){
unloadNamespace(ns)
}
}
有没有办法找出命名空间导入层次结构?如果是这样,那么我应该能够正确地订购最后一个循环......
【问题讨论】:
-
我早就放弃了这种方法。 AFAIK,
detach的文档说它不能保证工作。唯一有保证的方法是开始一个新的会话。 -
是的,很遗憾,我无法在 rpy2 AFAICT 下启动新会话 - 这是针对在当前设计中具有持久 R 会话的 Web 应用程序。
-
跟进@Andrie 的评论,最后几个对this SO question 的回答得到了
detaching 无法可靠地将您的会话恢复到其原始状态的原因之一。 -
是的,我几乎放弃了
detach()。现在,我正在尝试组合一个解决方案,该解决方案使用getNamespaceInfo()来确定导入,并递归地通过这些来确定导入层次结构。然后,自下而上unloadNamespace()。