Jak rozładować pakiet bez ponownego uruchamiania R.

540

Chciałbym zwolnić pakiet bez konieczności restartowania R (głównie dlatego, że restartowanie R podczas wypróbowywania różnych, pakiety powodujące konflikt stają się frustrujące, ale możliwe, że można to wykorzystać w programie do używania jednej funkcji, a następnie innej - chociaż przestrzeń nazw odwoływanie się jest prawdopodobnie lepszym pomysłem na takie zastosowanie).

?library nie pokazuje żadnych opcji, które mogłyby zwolnić pakiet.

Istnieje sugestia, że detachmożna zwolnić pakiet, ale oba następujące elementy kończą się niepowodzeniem:

detach(vegan)

Błąd w detach(vegan): nieprawidłowy nameargument

detach("vegan")

Błąd w detach("vegan"): nieprawidłowy nameargument

Jak więc rozładować paczkę?

Ari B. Friedman
źródło
4
@Iterator: Biblioteka to lokalizacja, w której znajdują się pakiety. (Nie są synonimami.) .libPaths()Podaje ścieżki do wszystkich bibliotek w systemie.
Richie Cotton
16
@Richie: Dzięki. Rozumiem to w kontekście R, ale czuję, że użycie R przeciąża lub sprawia, że ​​termin jest dwuznaczny na librarydwa sposoby: 1 - to nie to samo zastosowanie, libraryco gdzie indziej, i 2 - termin jest używany library()do załadowania ... biblioteka, ale pakiet.
Iterator,
2
@Iterator Masz rację. To była odpowiedź, której potrzebowałem, a kiedy googlowałem, użyłem „przeciwieństwo require” lub „cofnij library”, ponieważ tak zwykle ładuję, eerm, „paczki”. Właściwe nazwanie go sprawia, że ​​pytanie jest poprawniejsze, ale trudniejsze do znalezienia.
isomorphismes

Odpowiedzi:

656

Spróbuj tego (zobacz ?detachwięcej szczegółów):

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

Możliwe jest ładowanie wielu wersji pakietu jednocześnie (na przykład, jeśli masz wersję programistyczną i wersję stabilną w różnych bibliotekach). Aby zagwarantować odłączenie wszystkich kopii, użyj tej funkcji.

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)
  }
}

Wykorzystanie to na przykład

detach_package(vegan)

lub

detach_package("vegan", TRUE)
kohske
źródło
3
@ Hadley Rzeczywiście. Niecytowana wersja nie działa w najnowszej wersji R. Zaktualizowałem odpowiedź kohske, aby odzwierciedlić twoje rozwiązanie.
Ari B. Friedman
1
@ AriB.Friedman, teraz jako pytanie .
Eric Fail
1
> detach("package:MASS", unload=TRUE) Error in detach("package:MASS", unload = TRUE) : invalid 'name' argument
Mona Jalal,
5
Jeśli pojawi się nieprawidłowy argument argumentu „nazwa”, dodaj znak. Tylko = PRAWDA.
Dan Tenenbaum,
2
> detach („package: kriging”, unload = TRUE, character.only = T) Błąd w odłączeniu („package: kriging”, unload = TRUE, character.only = T): niepoprawny argument „name”. Jednak rozwiązanie @rstober działa!
Andrew
86

Możesz także użyć unloadNamespacepolecenia, jak w:

unloadNamespace("sqldf")

Funkcja odłącza przestrzeń nazw przed jej rozładowaniem.

październik
źródło
1
W przypadku, gdy rozwiązanie @ kohske również nie działało dla ciebie, zadziałało to dla mnie
Wassadamo,
29

Możesz odznaczyć przycisk pola wyboru w RStudio (pakiety).

Panel pakietów RStudio

Ajay Ohri
źródło
16
Warto dodać, że powoduje to wykonanie detach("package:packageToUnload", unload=TRUE)polecenia i nie różni się od proponowanego rozwiązania.
Konrad
2
Ponadto pole nie jest zaznaczone, jeśli pakiet został załadowany przy użyciu rstudio install & restart (błąd?). Ale możesz to po prostu zaznaczyć i odznaczyć.
jiggunjer
9

Próbowałem tego, co napisał Kohske jako odpowiedź, i ponownie otrzymałem błąd, więc przeprowadziłem wyszukiwanie i znalazłem to, co zadziałało dla mnie (R 3.0.2):

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

lub też

library(splines)
pkg <- "package:splines"
detach(pkg, character.only = TRUE)
Mehrad Mahmoudian
źródło
3
Jaki masz błąd? Ponieważ to działa dla mnie (R 3.1). Drugie rozwiązanie to ta sama odpowiedź @ koshke, tylko bez wyładowywania (więc przestrzeń nazw pakietu nie jest rozładowywana).
alko989,
Mam ten sam błąd. chodzi o to, że podałem to samo rozwiązanie co @Kohske, ale z inną nazwą pakietu. oznacza to po prostu, że jeśli użyjesz pakietu: powinien on działać dobrze, ale jeśli go nie użyjesz, otrzymasz taki sam błąd jak w pytaniu. ;)
Mehrad Mahmoudian
Czekaj ... więc próbowałeś rozładować paczkę, która nawet nie została załadowana? I jesteś zaskoczony, że masz błąd?
Gregor Thomas
@Gregor Czy przeczytałbyś wszystko jeszcze raz przed naciśnięciem przycisku downvote? !!! funkcja wymaga () i biblioteka () prawie robi to samo (przynajmniej w tym przypadku), więc pakiet jest już załadowany !! Nie jestem odpowiedzialny za brak informacji !!
Mehrad Mahmoudian
8

Podczas przechodzenia między skryptami może być czasem konieczne rozładowanie pakietu. Oto prosta instrukcja JEŻELI, która zapobiegnie pojawianiu się ostrzeżeń, gdybyś próbował wyładować pakiet, który nie został aktualnie załadowany.

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

Dołączenie tego na początku skryptu może być pomocne.

Mam nadzieję, że to sprawi, że Twój dzień!

dca
źródło
8

detach(package:PackageName) działa i nie ma potrzeby używania cudzysłowów.

Alper Gur
źródło
3

Możesz wypróbować wszystko, co chcesz usunąć pakiet (i wszystkie związane z nim zależności), unloadNamespace()ale ślad pamięci pozostanie. I nie, też detach("package:,packageName", unload=TRUE, force = TRUE)nie będzie działać.

Z nowej konsoli lub Session > Restart Rsprawdź pamięć za pomocą pryrpakietu:

pryr::mem_used()

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

Sprawdź mój 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   

Załadujmy Seuratpakiet i sprawdźmy nowy ślad pamięci :

library(Seurat)
pryr::mem_used()

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

Użyjmy, unloadNamespace()aby usunąć wszystko:

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")

Teraz sprawdź 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 

Sprawdź powierzchnię pamięci :

pryr::mem_used()

# 173 MB

Link do pokazu obsady ekranu

Matthew J. Oldach
źródło
2

Chciałbym dodać alternatywne rozwiązanie. To rozwiązanie nie odpowiada bezpośrednio na twoje pytanie dotyczące rozładowania pakietu, ale IMHO stanowi czystszą alternatywę dla osiągnięcia pożądanego celu, który, jak rozumiem, zasadniczo dotyczy unikania konfliktów nazw i wypróbowywania różnych funkcji, jak stwierdzono:

głównie dlatego, że restartowanie R, gdy wypróbowuję inne, konflikt pakietów staje się frustrujący, ale możliwe, że można to wykorzystać w programie do korzystania z jednej funkcji, a potem innej - chociaż odwoływanie się do przestrzeni nazw jest prawdopodobnie lepszym pomysłem

Rozwiązanie

Funkcja with_packageoferowana przez withrpakiet oferuje możliwość:

dołącz pakiet do ścieżki wyszukiwania, wykonuje kod, a następnie usuwa pakiet ze ścieżki wyszukiwania. Jednak przestrzeń nazw pakietu nie jest rozładowywana.

Przykład

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

geom_pointużyty w tym przykładzie nie jest dostępny z globalnej przestrzeni nazw. Myślę, że może to być czystszy sposób rozwiązywania konfliktów niż ładowanie i rozładowywanie paczek.

Konrad
źródło
1

Pamiętaj też, że możesz użyć tylko unload()raz. Jeśli użyjesz go po raz drugi bez ponownego uruchamiania library(), otrzymasz niezbyt pouczający komunikat o błędzie, niepoprawny argument „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

Utworzono 2020-05-09 przez pakiet reprezentx (v0.3.0)

Matifou
źródło
0

Wystarczy przejść do okna WYJŚCIE, a następnie kliknąć ikonę Pakiety (znajduje się między ikonami Wykres i Pomoc ). Usuń „ tik / znacznik wyboru ” z paczki, którą chcesz rozładować.

Aby ponownie skorzystać z pakietu, po prostu umieść „ ptaszka lub znacznik wyboru ” przed paczką lub użyj:

library (lme4)
EsKe
źródło
1
Nie, chyba że masz własną niestandardową ścieżkę biblioteki. Nie pojawia się w „Pakietach”, więc musisz wykonać powyższe metody
zazu