Ответ 1
Другая опция:
Vectorize(detach)(name=paste0("package:", c("Hmisc","survival","splines")), unload=TRUE, character.only=TRUE)
Вдохновленный этот ответ Я ищу способ отсоединить сразу несколько пакетов.
Когда я загружаю 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)
...
Другая опция:
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(...
необходимо, потому что, если character.only=TRUE
, detach
не обрабатывает свой первый аргумент нестандартным способом. Он проверяет, является ли это именем, и если да, использует substitute
и deparse
, чтобы превратить его в символ. (Аргумент 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
мне удалось просто отлично.
Чтобы удалить прикрепленные пакеты all:
lapply(names(sessionInfo()$otherPkgs), function(pkgs) detach(paste0('package:',pkgs),character.only = T,unload = T,force=T))