一次分离多个包裹

Posted

技术标签:

【中文标题】一次分离多个包裹【英文标题】:Detach several packages at once 【发布时间】:2013-07-07 01:39:31 【问题描述】:

受this answer 的启发,我正在寻找一种同时分离多个包的方法。

当我加载时说 Hmisc,

# install.packages("Hmisc", dependencies = TRUE)
require(Hmisc)

R 还加载 survivalsplines。我的问题是是否有办法一起卸载该组?

我目前正在做这样的事情,

detach(package:Hmisc, unload = T) 
detach(package:survival, unload = T) 
detach(package:splines, unload = T)

我试过了,

detach(package:c('Hmisc', 'survival', 'splines'), unload = T)

【问题讨论】:

我对组分离非常谨慎,因为您总是有可能使用一些 other 包,它也依赖于其中一个从属包。有点像在卸载某些应用程序时几乎不可能确定哪些 Windows DLL 可以安全删除:-( . @CarlWitthoft,感谢您的周到评论。 @CarlWitthoft detach 会检查依赖关系,并且会拒绝分离其他人在使用中需要的包。您可以通过 force=TRUE 覆盖它,但这当然是您自己的事。 @HongOoi -- 谢谢。我略过那部分。对不起。 【参考方案1】:

?detach 明确排除提供字符向量(与标量相反,即要分离的多个库)作为其第一个参数,但您始终可以创建一个辅助函数。这将接受多个输入,可以是字符串、名称或数字。数字与初始搜索列表中的条目匹配,因此搜索列表在每次分离后动态更新这一事实不会导致其中断。

mdetach <- function(..., unload = FALSE, character.only = FALSE, force = FALSE)

    path <- search()
    locs <- lapply(match.call(expand=FALSE)$..., function(l) 
        if(is.numeric(l))
            path[l]
        else l
    )
    lapply(locs, function(l)
        eval(substitute(detach(.l, unload=.u, character.only=.c, force=.f),
        list(.l=l, .u=unload, .c=character.only, .f=force))))
    invisible(NULL)


library(xts) # also loads zoo

# any combination of these work
mdetach(package:xts, package:zoo, unload=TRUE)
mdetach("package:xts", "package:zoo", unload=TRUE)
mdetach(2, 3, unload=TRUE)

eval(substitute(... 混淆是必要的,因为除非character.only=TRUE,否则detach 以非标准方式处理其第一个参数。它检查它是否是一个名称,如果是,则使用substitutedeparse 将其转换为字符。 (character.only 参数确实命名错误,因为detach(2, character.only=TRUE) 仍然有效。它应该真正称为“accept.names”或其他名称。)

【讨论】:

谢谢。感到内疚,因为我应该更仔细地阅读?detach。再次感谢您的回答。 @EricFail 没有理由感到内疚。这是一个好问题,答案的复杂性表明它并非微不足道。 您能否详细说明为什么detlist&lt;-c('Hmisc','survival','splines'); lapply(detlist, function(k) detach(k,unload=true)) 不起作用?帮助页面说 detach 可以接受字符串参数。 (如果我没看错的话,每个参数都是一个单元素字符串,而不是一个字符向量) 我没有投反对票,但我不明白为什么矢量化这么麻烦。 @Ferdinand.kraft 我猜只是完成了。此外,能够通过数字索引分离很好。【参考方案2】:

另一种选择:

Vectorize(detach)(name=paste0("package:", c("Hmisc","survival","splines")), unload=TRUE, character.only=TRUE)

【讨论】:

【参考方案3】:

回答我自己对洪的回答的问题:

detlist<-c('Hmisc','survival','splines')

lapply(detlist, function(k) detach( paste('package:', k, sep='', collapse=''), unload=TRUE, char=TRUE))

工作得很好。 base::detach 顶部的排序功能有点不稳定,但使用 character.only=TRUE 让我顺利通过。

【讨论】:

【参考方案4】:

删除所有当前附加的包:

lapply(names(sessionInfo()$otherPkgs), function(pkgs) detach(paste0('package:',pkgs),character.only = T,unload = T,force=T))

【讨论】:

以上是关于一次分离多个包裹的主要内容,如果未能解决你的问题,请参考以下文章

记一次拆分包裹的算法

分离式编译时 链接器工具错误 (一个变量被定义一次或多次)

生命周期只执行一次

一次前后端分离的实践

r 分离所有包裹

第一次写js轮播图