一次分离几个软件包

受到这个答案的启发,我正在寻找一种方法来一次分离几个软件包。

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

...


另外一个选择:

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

链接地址: http://www.djcxy.com/p/25009.html

上一篇: Detach several packages at once

下一篇: rm(list=ls()) doesn't completely clear the workspace