Как выгрузить пакет без перезапуска R

541

Я хотел бы выгрузить пакет без необходимости перезапуска R (в основном потому, что перезапуск R, когда я пробую разные, конфликтующие пакеты, вызывает разочарование, но, возможно, это можно использовать в программе, чтобы использовать одну функцию, а затем другую - хотя пространство имен ссылки, вероятно, лучшая идея для этого использования).

?library не показывает никаких опций, которые могли бы выгрузить пакет.

Существует предложение, которое detachможет выгрузить пакет, но следующие оба не удаются:

detach(vegan)

Ошибка в detach(vegan): неверный nameаргумент

detach("vegan")

Ошибка в detach("vegan"): неверный nameаргумент

Так как же выгрузить пакет?

Ари Б. Фридман
источник
5
@Iterator: библиотека - это место, где вы найдете пакеты. (Они не являются синонимами.) .libPaths()Дает вам пути ко всем библиотекам в вашей системе.
Ричи Коттон
17
@Richie: Спасибо. Я понимаю это в контексте R, но я чувствую, что использование R перегружает или делает неоднозначным термин libraryв двух отношениях: 1 - это не то же использование library, что и в других местах, и 2 - термин используется library()для загрузки ... не библиотека, но пакет.
Итератор
2
@ Итератор Вы правы. Это был ответ, который мне был нужен, и при поиске в Google я использовал «противоположность require» или «отмена library», потому что именно так я обычно загружаю «пакеты». Таким образом, правильное название делает вопрос более правильным, но также труднее найти.
изоморфизм

Ответы:

657

Попробуйте это (см. ?detachДля более подробной информации):

detach("package:vegan", unload=TRUE)

Можно одновременно загрузить несколько версий пакета (например, если у вас есть версия для разработки и стабильная версия в разных библиотеках). Чтобы гарантировать, что все копии отделены, используйте эту функцию.

detach_package <- function(pkg, character.only = FALSE)
{
  if(!character.only)
  {
    pkg <- deparse(substitute(pkg))
  }
  search_item <- paste("package", pkg, sep = ":")
  while(search_item %in% search())
  {
    detach(search_item, unload = TRUE, character.only = TRUE)
  }
}

Использование, например

detach_package(vegan)

или

detach_package("vegan", TRUE)
kohske
источник
3
@ Hadley Действительно. Версия без кавычек, похоже, не работает в последней версии R. Я обновил ответ Кохске, чтобы отразить ваше решение.
Ари Б. Фридман,
1
@ AriB.Friedman, теперь как вопрос .
Эрик Фэйл
1
> detach("package:MASS", unload=TRUE) Error in detach("package:MASS", unload = TRUE) : invalid 'name' argument
Мона Джалал
5
Если вы получили недопустимую ошибку аргумента 'name', добавьте character.only = TRUE.
Дэн Тененбаум
2
> detach («package: kriging», unload = TRUE, character.only = T) Ошибка в detach («package: kriging», unload = TRUE, character.only = T): недопустимый аргумент «имя». Однако решение @rstober работает!
Андрей
86

Вы также можете использовать unloadNamespaceкоманду, как в:

unloadNamespace("sqldf")

Функция отсоединяет пространство имен перед его выгрузкой.

rstober
источник
1
В случае, если решение @ kohske также не сработало для вас, это сработало для меня
Wassadamo
29

Вы можете снять флажок с кнопки в RStudio (пакеты).

Панель пакетов RStudio

Аджай Охри
источник
16
Стоит добавить, что это приводит к выполнению detach("package:packageToUnload", unload=TRUE)команды и ничем не отличается от уже предложенного решения.
Конрад
2
Кроме того, флажок не установлен, если пакет был загружен с помощью rstudio install & restart (ошибка?). Но вы можете просто проверить и снять галочку.
Джиггунджер
9

Я попробовал то, что Кохске написал в качестве ответа, и снова получил ошибку, поэтому я провел некоторый поиск и обнаружил, что это работает для меня (R 3.0.2):

require(splines) # package
detach(package:splines)

или также

library(splines)
pkg <- "package:splines"
detach(pkg, character.only = TRUE)
Мехрад Махмудян
источник
3
Какая у вас ошибка? Потому что это работает для меня (R 3.1). И второе решение - тот же ответ @ koshke, только без выгрузки (так что пространство имен пакета не выгружается).
alko989
Я получил ту же ошибку. Дело в том, что я дал то же решение, что и @Kohske, но с другим именем пакета. это просто означает, что если вы используете пакет: тогда он должен работать нормально, но если вы его не используете, вы получите ту же ошибку, что и в вопросе. ;)
Мехрад Махмудян
Подождите ... так вы пытались выгрузить пакет, который даже не был загружен? И вы удивлены, что получили ошибку?
Грегор Томас
@ Грегор Не могли бы вы еще раз прочитать все, прежде чем нажать кнопку downvote? !!! функция require () и library () делают почти то же самое (по крайней мере, в этом случае), поэтому пакет уже загружен !! Я не несу ответственности за недостаток информации!
Мехрад Махмудян
8

Когда вы собираетесь туда и обратно между сценариями он может только иногда необходимо выгрузить пакет. Вот простой оператор IF, который предотвратит появление предупреждений, если вы попытаетесь выгрузить пакет, который еще не был загружен.

if("package:vegan" %in% search()) detach("package:vegan", unload=TRUE) 

Включение этого в начало сценария может быть полезным.

Я надеюсь, что это делает ваш день!

дк
источник
8

detach(package:PackageName) работает и нет необходимости использовать кавычки.

Альпер Гур
источник
3

Вы можете попробовать все, что хотите, чтобы удалить пакет (и все зависимости, которые он ввел вместе с ним), unloadNamespace()но объем памяти все равно останется. И нет,detach("package:,packageName", unload=TRUE, force = TRUE) работать тоже не будет.

Из новой консоли или Session > Restart Rпроверьте память с помощью pryrпакета:

pryr::mem_used()

# 40.6 MB   ## This will depend on which packages are loaded obviously (can also fluctuate a bit after the decimal)

Проверь мой sessionInfo()

R version 3.6.1 (2019-07-05)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 17763)

Matrix products: default

locale:
[1] LC_COLLATE=English_Canada.1252  LC_CTYPE=English_Canada.1252    LC_MONETARY=English_Canada.1252 LC_NUMERIC=C                   
[5] LC_TIME=English_Canada.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] compiler_3.6.1   pryr_0.1.4       magrittr_1.5     tools_3.6.1      Rcpp_1.0.3       stringi_1.4.3    codetools_0.2-16 stringr_1.4.0   
[9] packrat_0.5.0   

Давайте загрузим Seuratпакет и проверим новый объем памяти :

library(Seurat)
pryr::mem_used()

# 172 MB    ## Likely to change in the future but just to give you an idea

Давайте использовать, unloadNamespace()чтобы удалить все:

unloadNamespace("Seurat")
unloadNamespace("ape")
unloadNamespace("cluster")
unloadNamespace("cowplot")
unloadNamespace("ROCR")
unloadNamespace("gplots")
unloadNamespace("caTools")
unloadNamespace("bitops")
unloadNamespace("fitdistrplus")
unloadNamespace("RColorBrewer")
unloadNamespace("sctransform")
unloadNamespace("future.apply")
unloadNamespace("future")
unloadNamespace("plotly")
unloadNamespace("ggrepel")
unloadNamespace("ggridges")
unloadNamespace("ggplot2")
unloadNamespace("gridExtra")
unloadNamespace("gtable")
unloadNamespace("uwot")
unloadNamespace("irlba")
unloadNamespace("leiden")
unloadNamespace("reticulate")
unloadNamespace("rsvd")
unloadNamespace("survival")
unloadNamespace("Matrix")
unloadNamespace("nlme")
unloadNamespace("lmtest")
unloadNamespace("zoo")
unloadNamespace("metap")
unloadNamespace("lattice")
unloadNamespace("grid")
unloadNamespace("httr")
unloadNamespace("ica")
unloadNamespace("igraph")
unloadNamespace("irlba")
unloadNamespace("KernSmooth")
unloadNamespace("leiden")
unloadNamespace("MASS")
unloadNamespace("pbapply")
unloadNamespace("plotly")
unloadNamespace("png")
unloadNamespace("RANN")
unloadNamespace("RcppAnnoy")
unloadNamespace("tidyr")
unloadNamespace("dplyr")
unloadNamespace("tibble")
unloadNamespace("RANN")
unloadNamespace("tidyselect")
unloadNamespace("purrr")
unloadNamespace("htmlwidgets")
unloadNamespace("htmltools")
unloadNamespace("lifecycle")
unloadNamespace("pillar")
unloadNamespace("vctrs")
unloadNamespace("rlang")
unloadNamespace("Rtsne")
unloadNamespace("SDMTools")
unloadNamespace("Rdpack")
unloadNamespace("bibtex")
unloadNamespace("tsne")
unloadNamespace("backports")
unloadNamespace("R6")
unloadNamespace("lazyeval")
unloadNamespace("scales")
unloadNamespace("munsell")
unloadNamespace("colorspace")
unloadNamespace("npsurv")
unloadNamespace("compiler")
unloadNamespace("digest")
unloadNamespace("R.utils")
unloadNamespace("pkgconfig")
unloadNamespace("gbRd")
unloadNamespace("parallel")
unloadNamespace("gdata")
unloadNamespace("listenv")
unloadNamespace("crayon")
unloadNamespace("splines")
unloadNamespace("zeallot")
unloadNamespace("reshape")
unloadNamespace("glue")
unloadNamespace("lsei")
unloadNamespace("RcppParallel")
unloadNamespace("data.table")
unloadNamespace("viridisLite")
unloadNamespace("globals")

Теперь проверьте sessionInfo():

R version 3.6.1 (2019-07-05)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 17763)

Matrix products: default

locale:
[1] LC_COLLATE=English_Canada.1252  LC_CTYPE=English_Canada.1252    LC_MONETARY=English_Canada.1252 LC_NUMERIC=C                   
[5] LC_TIME=English_Canada.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
 [1] tools_3.6.1       stringr_1.4.0     rstudioapi_0.10   pryr_0.1.4        jsonlite_1.6      gtools_3.8.1      R.oo_1.22.0      
 [8] magrittr_1.5      Rcpp_1.0.3        R.methodsS3_1.7.1 stringi_1.4.3     plyr_1.8.4        reshape2_1.4.3    codetools_0.2-16 
[15] packrat_0.5.0     assertthat_0.2.1 

Проверьте объем памяти :

pryr::mem_used()

# 173 MB

Ссылка на демонстрацию ролей

Мэтью Дж. Олдак
источник
2

Я хотел бы добавить альтернативное решение. Это решение не дает прямого ответа на ваш вопрос о выгрузке пакета, но, IMHO, предоставляет более чистую альтернативу для достижения желаемой цели, которая, как я понимаю, в целом связана с предотвращением конфликтов имен и пробой различных функций, как указано:

в основном потому, что перезапуск R, когда я пробую разные, конфликтующие пакеты, вызывает разочарование, но, возможно, это можно использовать в программе для использования одной функции, а затем другой - хотя ссылки на пространство имен, вероятно, являются лучшей идеей для такого использования

Решение

Функция, with_packageпредлагаемая через withrпакет, дает возможность:

прикрепить пакет к пути поиска, выполнить код, а затем удалить пакет из пути поиска. Однако пространство имен пакета не выгружается.

пример

library(withr)
with_package("ggplot2", {
  ggplot(mtcars) + geom_point(aes(wt, hp))
})
# Calling geom_point outside withr context 
exists("geom_point")
# [1] FALSE

geom_pointиспользуемый в примере недоступен из глобального пространства имен. Я считаю, что это может быть более чистый способ обработки конфликтов, чем загрузка и выгрузка пакетов.

Konrad
источник
1

Обратите внимание, что вы можете использовать только unload()один раз. Если вы используете его второй раз без повторного library()запуска, вы получите не очень информативное сообщение об ошибке, недопустимый аргумент 'name' :

library(vegan)
#> Loading required package: permute
#> Loading required package: lattice
#> This is vegan 2.5-6
detach("package:vegan",  unload=TRUE)
detach("package:vegan",  unload=TRUE)
#> Error in detach("package:vegan", unload = TRUE): invalid 'name' argument

Создано 2020-05-09 пакетом представлением (v0.3.0)

Matifou
источник
0

Просто перейдите в окно OUTPUT, затем щелкните значок Packages (он расположен между иконками Plot и Help ). Удалите « галочку / галочку » из пакета, который вы хотите выгрузить.

Для повторного использования пакета просто поставьте « галочку или галочку » перед пакетом или используйте:

library (lme4)
Eske
источник
1
Нет, если у вас нет собственного пути к библиотеке. Он не отображается в разделе «Пакеты», поэтому вы должны выполнить описанные выше методы
zazu