一次分离几个包

时间:2013-07-09 12:39:46

标签: r packages

灵感来自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)

...

4 个答案:

答案 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=TRUEdetach以非标准方式处理其第一个参数。它会检查它是否是名称,如果是,则使用substitutedeparse将其转换为字符。 (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))