一次分离多个包裹
Posted
技术标签:
【中文标题】一次分离多个包裹【英文标题】:Detach several packages at once 【发布时间】:2013-07-07 01:39:31 【问题描述】:受this answer 的启发,我正在寻找一种同时分离多个包的方法。
当我加载时说 Hmisc,
# install.packages("Hmisc", dependencies = TRUE)
require(Hmisc)
R
还加载 survival
和 splines
。我的问题是是否有办法一起卸载该组?
我目前正在做这样的事情,
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,感谢您的周到评论。 @CarlWitthoftdetach
会检查依赖关系,并且会拒绝分离其他人在使用中需要的包。您可以通过 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
以非标准方式处理其第一个参数。它检查它是否是一个名称,如果是,则使用substitute
和deparse
将其转换为字符。 (character.only
参数确实命名错误,因为detach(2, character.only=TRUE)
仍然有效。它应该真正称为“accept.names”或其他名称。)
【讨论】:
谢谢。感到内疚,因为我应该更仔细地阅读?detach
。再次感谢您的回答。
@EricFail 没有理由感到内疚。这是一个好问题,答案的复杂性表明它并非微不足道。
您能否详细说明为什么detlist<-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))
【讨论】:
以上是关于一次分离多个包裹的主要内容,如果未能解决你的问题,请参考以下文章