Разгрузить / отсоединить все загруженные пространства имен и присоединенные пакеты в R - PullRequest
1 голос
/ 24 сентября 2019

У меня были проблемы с загрязнением глобальной области действия присоединенными пакетами (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)

Ошибка в unloadNamespace (pkg): пространство имен 'grDevices' isимпортируется с помощью 'grid', 'graphics', 'stats', поэтому не может быть выгружен

Похоже, что он пытается выгрузить базовые пакеты, что не является моей целью.Я не уверен, как указать никаких базовых пакетов.

Я хотел бы использовать detach(..., unload=T, character.only=T, force=T), но это не помогло, как объяснено в документации:

... еслипространство имен импортируется другим пространством имен, или выгрузка имеет значение FALSE, выгрузка не произойдет.

Существует ли более простой или работающий метод для выгрузки всех пространств имен, включая те, которые могут быть импортированы другими?если пространство имен импортируется другим пространством имен или выгрузка имеет значение FALSE, выгрузка не произойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...