一次分离几个包

Eri*_*ail 12 packages r

受到这个答案的启发,我正在寻找一种方法来同时分离几个包.

当我加载说Hmisc,

# install.packages("Hmisc", dependencies = TRUE)
require(Hmisc)
Run Code Online (Sandbox Code Playgroud)

R也加载survivalsplines.我的问题是,是否有办法将该组一起卸载?

我现在做这样的事,

detach(package:Hmisc, unload = T) 
detach(package:survival, unload = T) 
detach(package:splines, unload = T)
Run Code Online (Sandbox Code Playgroud)

我试过了,

detach(package:c('Hmisc', 'survival', 'splines'), unload = T)
Run Code Online (Sandbox Code Playgroud)

...

Fer*_*aft 11

另外一个选项:

Vectorize(detach)(name=paste0("package:", c("Hmisc","survival","splines")), unload=TRUE, character.only=TRUE)
Run Code Online (Sandbox Code Playgroud)


Hon*_*Ooi 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)
Run Code Online (Sandbox Code Playgroud)

与餐间eval(substitute(...是必要的,因为,除非character.only=TRUE,detach处理在一个非标准的方式第一个参数.它会检查它是否是名称,如果是,则使用substitute并将deparse其转换为字符.(这个character.only论点的名字确实是错误的,因为detach(2, character.only=TRUE)它仍然有效.它应该被称为"accept.names"或其他东西.)