一次分离几个软件包
受到这个答案的启发,我正在寻找一种方法来一次分离几个软件包。
当我装载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)
...
另外一个选择:
Vectorize(detach)(name=paste0("package:", c("Hmisc","survival","splines")), unload=TRUE, character.only=TRUE)
?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(...
混淆eval(substitute(...
是必要的,因为除非character.only=TRUE
, detach
以非标准方式处理其第一个参数。它检查它是否是名称,如果是,则使用substitute
和deparse
将其转换为字符(该character.only
说法是真的名不副实,因为detach(2, character.only=TRUE)
仍然有效。它应该被称为“accept.names”什么的。)
为了回答香港回答我自己的问题:
detlist<-c('Hmisc','survival','splines')
lapply(detlist, function(k) detach( paste('package:', k, sep='', collapse=''), unload=TRUE, char=TRUE))
工作得很好。 base::detach
顶部的排序功能有点不可取,但是使用character.only=TRUE
让我感觉很好。