gpt4 book ai didi

r - 如何确定 [R] 中的命名空间导入顺序

转载 作者:行者123 更新时间:2023-12-04 16:12:02 25 4
gpt4 key购买 nike

我需要清理一个 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)
}
}

有没有办法找出命名空间导入层次结构?如果是这样,那么我应该能够正确地订购最后一个循环......

最佳答案

好的,我已经为公认的hacky需求拼凑了一个hacky解决方案。任何关于如何更好地做到这一点的建议将不胜感激。特别是,我对 <<- 不太满意全局赋值namespace_depths目的。

original_packages <- grep('^package:', search(), value = TRUE)
original_namespaces <- loadedNamespaces()

library(ggplot2)
library(plyr)

loadedNamespaces()

new_packages <- Filter(function(pkg) { ! pkg %in% original_packages }, grep('^package:', search(), value = TRUE))

new_namespaces <- Filter(function(ns) { ! ns %in% original_namespaces }, loadedNamespaces())

get_imports <- function(ns, depth) {

imports <- Filter(function(ns) { ! ns %in% original_namespaces }, names(getNamespaceInfo(ns, 'imports')))
if (length(imports) == 0 ) {
if ( is.null(namespace_depths[[ns]]) || namespace_depths[[ns]] < depth){
namespace_depths[[ns]] <<- depth
}
return()
}
for (imported_ns in imports){
get_imports(imported_ns, depth + 1)
}
if ( is.null(namespace_depths[[ns]]) || namespace_depths[[ns]] < depth){
namespace_depths[[ns]] <<- depth
}
}

namespace_depths <- list()
sapply(new_namespaces, get_imports, 0)

for (ns in names(namespace_depths)[order(unlist(namespace_depths))]) {
if (! ns %in% original_namespaces){
unloadNamespace(ns)
}
}

for (pkg in new_packages){
detach(pkg, unload=TRUE, force=TRUE, character.only=TRUE)
}

关于r - 如何确定 [R] 中的命名空间导入顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11232026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com