12

这个答案的启发,我正在寻找一种方法来一次分离多个包裹。

当我加载说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)

…</p>

4

4 回答 4

11

另外一个选项:

Vectorize(detach)(name=paste0("package:", c("Hmisc","survival","splines")), unload=TRUE, character.only=TRUE)
于 2013-07-09T13:10:01.277 回答
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(...因为除非以非标准方式处理其第一个参数。它检查它是否是一个名字,如果是,使用and把它变成字符。(这个论点确实命名错误,仍然有效。它真的应该被称为“accept.names”或其他东西。)character.only=TRUEdetachsubstitutedeparsecharacter.onlydetach(2, character.only=TRUE)

于 2013-07-09T13:00:06.240 回答
2

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

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

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

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

于 2013-07-09T17:21:55.270 回答
1

要删除所有当前附加的包:

lapply(names(sessionInfo()$otherPkgs), function(pkgs) detach(paste0('package:',pkgs),character.only = T,unload = T,force=T))
于 2016-12-16T18:41:35.840 回答