So entladen Sie ein Paket, ohne R neu zu starten


540

Ich möchte ein Paket entladen, ohne R neu starten zu müssen (hauptsächlich, weil das Neustarten von R beim Ausprobieren verschiedener, widersprüchlicher Pakete frustrierend wird, aber möglicherweise könnte dies in einem Programm verwendet werden, um eine Funktion und dann eine andere zu verwenden - obwohl Namespace Referenzierung ist wahrscheinlich eine bessere Idee für diese Verwendung).

?library zeigt keine Optionen an, die ein Paket entladen würden.

Es gibt einen Vorschlag , der detachdas Paket entladen kann, aber die folgenden beiden schlagen fehl:

detach(vegan)

Fehler in detach(vegan): ungültiges nameArgument

detach("vegan")

Fehler in detach("vegan"): ungültiges nameArgument

Wie entlade ich ein Paket?


4
@Iterator: Eine Bibliothek ist ein Ort, an dem Sie Pakete finden. (Sie sind nicht synonym.) .libPaths()Gibt Ihnen die Pfade zu allen Bibliotheken auf Ihrem System.
Richie Cotton

16
@ Richard: Danke. Ich verstehe das im R-Kontext, aber ich habe das Gefühl, dass die R-Verwendung den Begriff libraryauf zwei Arten überlastet oder mehrdeutig macht : 1 - es ist nicht die gleiche Verwendung librarywie anderswo und 2 - der Begriff wird library()zum Laden verwendet ... nicht a Bibliothek, aber ein Paket.
Iterator

2
@Iterator Du hast recht. Dies war die Antwort, die ich brauchte, und beim Googeln habe ich "Gegenteil von require" oder "Rückgängig library" verwendet, weil ich so normalerweise "Pakete" lade. Wenn Sie es also richtig betiteln, ist die Frage korrekter, aber auch schwieriger zu finden.
Isomorphismen

Antworten:


656

Versuchen Sie dies (siehe ?detachfür weitere Details):

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

Es ist möglich, mehrere Versionen eines Pakets gleichzeitig zu laden (z. B. wenn Sie eine Entwicklungsversion und eine stabile Version in verschiedenen Bibliotheken haben). Verwenden Sie diese Funktion, um sicherzustellen, dass alle Kopien getrennt werden.

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

Verwendung ist zum Beispiel

detach_package(vegan)

oder

detach_package("vegan", TRUE)

3
@ Hadley In der Tat. Die nicht zitierte Version scheint in der neuesten Version von R nicht zu funktionieren. Ich habe die Antwort von kohske aktualisiert, um Ihre Lösung widerzuspiegeln.
Ari B. Friedman

1
@ AriB.Friedman, jetzt als Frage .
Eric Fail

1
> detach("package:MASS", unload=TRUE) Error in detach("package:MASS", unload = TRUE) : invalid 'name' argument
Mona Jalal

5
Wenn Sie einen ungültigen 'name'-Argumentfehler erhalten, fügen Sie Zeichen hinzu.
Dan Tenenbaum

2
> trennen ("Paket: kriging", entladen = WAHR, Zeichen.nur = T) Fehler beim Trennen ("Paket: kriging", entladen = WAHR, Zeichen.nur = T): ungültiges Argument 'Name'. Die @ rstober-Lösung funktioniert jedoch!
Andrew

86

Sie können den unloadNamespaceBefehl auch wie folgt verwenden:

unloadNamespace("sqldf")

Die Funktion trennt den Namespace vor dem Entladen.


1
Falls @ kohskes Lösung auch für Sie nicht funktioniert hat, hat dies für mich
funktioniert

29

Sie können das Kontrollkästchen in RStudio (Pakete) deaktivieren.

Bereich für RStudio-Pakete


16
Es ist erwähnenswert, dass dies dazu führt, dass ein detach("package:packageToUnload", unload=TRUE)Befehl ausgeführt wird und sich nicht von der bereits vorgeschlagenen Lösung unterscheidet.
Konrad

2
Außerdem ist das Kontrollkästchen nicht aktiviert, wenn das Paket mit rstudio install & restart geladen wurde (Fehler?). Sie können es jedoch einfach aktivieren und deaktivieren.
Jiggunjer

9

Ich habe versucht, was kohske als Antwort geschrieben hat, und habe erneut einen Fehler erhalten. Deshalb habe ich eine Suche durchgeführt und diese gefunden, die für mich funktioniert hat (R 3.0.2):

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

oder auch

library(splines)
pkg <- "package:splines"
detach(pkg, character.only = TRUE)

3
Welchen Fehler bekommen Sie? Weil es bei mir funktioniert (R 3.1). Und die zweite Lösung ist die gleiche Antwort von @ koshke, nur ohne Entladen (damit der Paket-Namespace nicht entladen wird).
Alko989

Ich habe den gleichen Fehler bekommen. Der Punkt ist, dass ich die gleiche Lösung wie @Kohske gegeben habe, aber mit einem anderen Paketnamen. Es bedeutet einfach, dass wenn Sie das Paket verwenden: dann sollte es gut funktionieren, aber wenn Sie das nicht verwenden, erhalten Sie den gleichen Fehler wie in der Frage. ;)
Mehrad Mahmoudian

Warten Sie ... also haben Sie versucht, ein Paket zu entladen, das noch nicht einmal geladen war? Und du bist überrascht, dass du einen Fehler hast?
Gregor Thomas

@ Gregor Würdest du bitte alles noch einmal lesen, bevor du den Downvote-Button drückst? !!! Die Funktion require () und library () machen fast dasselbe (zumindest in diesem Fall), also ist das Paket bereits geladen !! Ich bin nicht verantwortlich für Sie Mangel an Informationen!
Mehrad Mahmoudian

8

Wenn Sie zwischen Skripten hin und her gehen, ist es möglicherweise nur manchmal erforderlich, ein Paket zu entladen. Hier ist eine einfache IF-Anweisung, die Warnungen verhindert, die angezeigt werden, wenn Sie versuchen, ein Paket zu entladen, das derzeit nicht geladen wurde.

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

Das Einfügen oben in ein Skript kann hilfreich sein.

Ich hoffe das macht deinen Tag!


8

detach(package:PackageName) funktioniert und es besteht keine Notwendigkeit, Anführungszeichen zu verwenden.


3

Sie können alles versuchen , um ein Paket (und alle damit verbundenen Abhängigkeiten) zu entfernen, unloadNamespace()aber der Speicherbedarf bleibt bestehen. Und nein, detach("package:,packageName", unload=TRUE, force = TRUE)wird auch nicht funktionieren.

Von einer neuen Konsole oder Session > Restart Rüberprüfen Sie den Speicher mit dem pryrPaket:

pryr::mem_used()

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

Prüfe mein 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   

Laden wir das SeuratPaket und überprüfen den neuen Speicherbedarf :

library(Seurat)
pryr::mem_used()

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

Verwenden wir unloadNamespace(), um alles zu entfernen:

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

Überprüfen Sie nun 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 

Überprüfen Sie den Speicherbedarf :

pryr::mem_used()

# 173 MB

Link zur Screencast-Demonstration


2

Ich möchte eine alternative Lösung hinzufügen. Diese Lösung beantwortet Ihre Frage zum Entladen eines Pakets nicht direkt , bietet jedoch meiner Meinung nach eine sauberere Alternative, um Ihr gewünschtes Ziel zu erreichen. Ich verstehe, dass es im Großen und Ganzen darum geht, Namenskonflikte zu vermeiden und verschiedene Funktionen auszuprobieren, wie angegeben:

Meistens, weil das Neustarten von R beim Ausprobieren verschiedener, widersprüchlicher Pakete frustrierend wird, aber möglicherweise könnte dies in einem Programm verwendet werden, um eine Funktion und dann eine andere zu verwenden - obwohl die Namespace-Referenzierung wahrscheinlich eine bessere Idee für diese Verwendung ist

Lösung

Die with_packageüber das withrPaket angebotene Funktion bietet die Möglichkeit:

Hängen Sie ein Paket an den Suchpfad an, führen Sie den Code aus und entfernen Sie das Paket aus dem Suchpfad. Der Paketnamespace wird jedoch nicht entladen.

Beispiel

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

geom_pointAuf das im Beispiel verwendete Element kann nicht über den globalen Namespace zugegriffen werden. Ich denke, es ist eine sauberere Art, mit Konflikten umzugehen, als Pakete zu laden und zu entladen.


1

Beachten Sie auch, dass Sie nur unload()einmal verwenden können. Wenn Sie es ein zweites Mal ohne erneutes library()Ausführen verwenden, wird die nicht sehr informative Fehlermeldung ungültiges Argument 'Name' angezeigt :

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

Erstellt am 2020-05-09 durch das reprex-Paket (v0.3.0)


0

Gehen Sie einfach auf OUTPUT Fenster, dann klicken Sie auf Symbol Pakete (es zwischen befindet Plot und Help - Icons). Entfernen Sie " Häkchen / Häkchen " aus dem Paket, das entladen werden soll.

Wenn Sie das Paket erneut verwenden möchten, setzen Sie einfach ein Häkchen oder ein Häkchen vor das Paket oder verwenden Sie:

library (lme4)

1
Nicht, wenn Sie keinen eigenen benutzerdefinierten Bibliothekspfad haben. Es wird nicht unter "Pakete" angezeigt, daher müssen Sie die oben genannten Methoden
ausführen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.