我遇到了附加包(sessionInfo()$otherPkgs
)和命名空间(loadedNamespaces()
) 污染全局范围的问题。因此我想在脚本开始时清除它们。
这个主题解决了部分问题,但关键差异是我想要卸载命名空间,而不仅仅是分离包。 Pacman 也很有趣,但似乎也无法解决问题。
library(dbplyr)
names(sessionInfo()$otherPkgs)
lapply(paste("package:", names(sessionInfo()$otherPkgs), sep=""),
detach, character.only = TRUE, unload = TRUE)
# `dbplyr` is detached
names(sessionInfo()$otherPkgs)
然而,对于卸载已加载的命名空间,类似的方法要困难得多,因为依赖其他命名空间的软件包必须首先卸载。
这是我的尝试:
# Recursive unload which checks for reverse dependencies (children) along the way
# and unloads them first
myunload <- function(pkg) {
# Get child (reverse-dependent) packages that have loaded namespaces
child_pkgs <- unlist(tools::dependsOnPkgs(pkg, which = c("Depends", "Imports"), reverse = T))
child_pkgs <- child_pkgs[which(child_pkgs %in% loadedNamespaces())]
# Recursively unload child packages
lapply(child_pkgs, myunload)
unloadNamespace(pkg)
}
# Apply over all our loaded namespaces
lapply(loadedNamespaces(), myunload)
测试它:
lapply(loadedNamespaces(), myunload)
卸载程序包时出错:Error in unloadNamespace(pkg) : 由于“grid”、“graphics”、“stats”导入了“grDevices”命名空间,因此无法卸载
看起来它正在尝试卸载基础程序包,这不是我的意图。我不确定如何指定不使用基础程序包。
我想使用 detach(..., unload=T, character.only=T, force=T)
但这会失败,正如文档中所述:
如果该命名空间被另一个命名空间导入或者 unload 为 FALSE,则不会发生卸载。
是否有更简单或有效的方法可以卸载所有命名空间,包括那些可能被其他命名空间导入的命名空间?如果该命名空间被另一个命名空间导入或者 unload 为 FALSE,则不会发生卸载。
.rs.restartR()
。但对我来说,它仅起作用了一次,之后,每次尝试重新启动 RStudio 时,它都会卡住。 - Lodyk Vovchak