灵感来自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)
...
答案 0 :(得分:10)
另一种选择:
Vectorize(detach)(name=paste0("package:", c("Hmisc","survival","splines")), unload=TRUE, character.only=TRUE)
答案 1 :(得分:5)
?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”或其他东西。)
答案 2 :(得分:2)
回答我对Hong的回答的问题:
detlist<-c('Hmisc','survival','splines')
lapply(detlist, function(k) detach( paste('package:', k, sep='', collapse=''), unload=TRUE, char=TRUE))
工作得很好。 base::detach
顶部的排序功能有点不稳定,但使用character.only=TRUE
让我通过了。
答案 3 :(得分:1)
删除所有当前附加的包:
lapply(names(sessionInfo()$otherPkgs), function(pkgs) detach(paste0('package:',pkgs),character.only = T,unload = T,force=T))