卸载/分离R中所有已加载的命名空间和附加包

时间:2019-09-24 20:43:29

标签: r namespaces package

我遇到了由附加包(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,则不会发生卸载。

0 个答案:

没有答案