Снять сразу несколько пакетов

Вдохновленный этот ответ Я ищу способ отсоединить сразу несколько пакетов.

Когда я загружаю 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)

...

Ответ 1

Другая опция:

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

Ответ 2

?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=TRUE, detach не обрабатывает свой первый аргумент нестандартным способом. Он проверяет, является ли это именем, и если да, использует substitute и deparse, чтобы превратить его в символ. (Аргумент character.only неверно назван, поскольку detach(2, character.only=TRUE) все еще работает. Его действительно следует называть "accept.names" или что-то в этом роде.)

Ответ 3

Чтобы ответить на мой собственный вопрос в ответ Хонга:

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

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

Хорошо работает. Функция сортировки в верхней части base::detach немного нестабильна, но с помощью character.only=TRUE мне удалось просто отлично.

Ответ 4

Чтобы удалить прикрепленные пакеты all:

lapply(names(sessionInfo()$otherPkgs), function(pkgs) detach(paste0('package:',pkgs),character.only = T,unload = T,force=T))