我需要清理一个 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)
}
}
有没有办法找出命名空间导入层次结构?如果是这样,那么我应该能够正确地订购最后一个循环......