我遇到了由附加包(sessionInfo()$otherPkgs
)和名称空间(loadedNamespaces()
)污染的全局范围的问题。所以我想在脚本开始时清除它们。
此thread中的问题已解决了一半。这个问题的主要区别在于我要卸载名称空间,而不仅仅是分离包。 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)
unloadNamespace(pkg)中的错误: 名称空间“ grDevices”是由“网格”,“图形”,“统计信息”导入的,因此无法卸载
似乎正在尝试卸载基本软件包,这不是我的意图。我不确定如何不指定基本软件包。
我想使用detach(..., unload=T, character.only=T, force=T)
,但这失败了,如文档中所述:
...如果该名称空间是由另一个名称空间导入的,或者卸载为FALSE,则不会发生卸载。
是否有一种更简单的方法或一种可行的方法来卸载所有名称空间,包括可能由其他名称空间导入的名称空间? 如果名称空间是由另一个名称空间导入的,或者卸载为FALSE,则不会发生卸载。