Comment décharger un package sans redémarrer R

541

Je voudrais décharger un paquet sans avoir à redémarrer R (principalement parce que redémarrer R alors que j'essaye différents paquets conflictuels devient frustrant, mais il est concevable que cela puisse être utilisé dans un programme pour utiliser une fonction puis une autre - bien que l'espace de noms le référencement est probablement une meilleure idée pour cette utilisation).

?library n'affiche aucune option permettant de décharger un package.

Il existe une suggestion qui detachpeut décharger le package, mais les deux suivantes échouent:

detach(vegan)

Erreur dans detach(vegan): nameargument non valide

detach("vegan")

Erreur dans detach("vegan"): nameargument non valide

Alors, comment puis-je décharger un colis?

Ari B. Friedman
la source
5
@Iterator: Une bibliothèque est un emplacement où vous trouvez des packages. (Ils ne sont pas synonymes.) .libPaths()Vous donne les chemins d'accès à toutes les bibliothèques de votre système.
Richie Cotton
17
@Richie: Merci. Je comprends cela dans le contexte R, mais je pense que l'utilisation R surcharge ou rend le terme ambigu libraryde deux manières: 1 - ce n'est pas la même utilisation libraryqu'ailleurs, et 2 - le terme est utilisé library()pour charger ... pas un bibliothèque, mais un package.
Iterator
2
@Iterator Vous avez raison. C'était la réponse dont j'avais besoin, et lors de la recherche sur Google, j'ai utilisé "opposé à require" ou "annuler library" parce que c'est généralement ainsi que je charge, euh, "packages". Le titrer correctement rend la question plus correcte mais aussi plus difficile à trouver.
isomorphismes

Réponses:

657

Essayez ceci (voir ?detachpour plus de détails):

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

Il est possible d'avoir plusieurs versions d'un package chargées à la fois (par exemple, si vous avez une version de développement et une version stable dans différentes bibliothèques). Pour garantir que toutes les copies sont détachées, utilisez cette fonction.

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

L'utilisation est, par exemple

detach_package(vegan)

ou

detach_package("vegan", TRUE)
kohske
la source
3
@hadley En effet. La version non citée ne semble pas fonctionner dans la dernière version de R. J'ai mis à jour la réponse de kohske pour refléter votre solution.
Ari B. Friedman
1
@ AriB.Friedman, maintenant comme une question .
Eric Fail
1
> detach("package:MASS", unload=TRUE) Error in detach("package:MASS", unload = TRUE) : invalid 'name' argument
Mona Jalal
5
Si vous obtenez une erreur d'argument «nom» non valide, ajoutez character.only = TRUE.
Dan Tenenbaum
2
> detach ("package: kriging", unload = TRUE, character.only = T) Erreur dans detach ("package: kriging", unload = TRUE, character.only = T): argument "nom" non valide. Cependant, la solution @rstober fonctionne!
Andrew
86

Vous pouvez également utiliser la unloadNamespacecommande, comme dans:

unloadNamespace("sqldf")

La fonction détache l'espace de noms avant de le décharger.

rstober
la source
1
Au cas où la solution de @ kohske ne fonctionnerait pas non plus pour vous, cela a fonctionné pour moi
Wassadamo
29

Vous pouvez décocher la case à cocher dans RStudio (packages).

Volet des packages RStudio

Ajay Ohri
la source
16
Il convient d'ajouter que cela se traduit par l' detach("package:packageToUnload", unload=TRUE)exécution d' une commande et n'est pas différent de la solution déjà proposée.
Konrad
2
De plus, la case n'est pas cochée si le paquet a été chargé en utilisant l'installation et le redémarrage de rstudio (bug?). Mais vous pouvez simplement le cocher et le décocher.
jiggunjer
9

J'ai essayé ce que kohske a écrit comme réponse et j'ai encore eu une erreur, alors j'ai fait une recherche et j'ai trouvé cela qui fonctionnait pour moi (R 3.0.2):

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

ou aussi

library(splines)
pkg <- "package:splines"
detach(pkg, character.only = TRUE)
Mehrad Mahmoudian
la source
3
Quelle erreur obtenez-vous? Parce que ça marche pour moi (R 3.1). Et la deuxième solution est la même réponse de @ koshke, uniquement sans déchargement (donc l'espace de noms du paquet n'est pas déchargé).
alko989
J'ai eu la même erreur. le fait est que j'ai donné la même solution que @Kohske mais avec un nom de package différent. cela signifie simplement que si vous utilisez le package: cela devrait fonctionner correctement, mais si vous ne l'utilisez pas, vous obtiendrez la même erreur que dans la question. ;)
Mehrad Mahmoudian
Attendez ... alors vous avez essayé de décharger un paquet qui n'était même pas chargé? Et vous êtes surpris d'avoir une erreur?
Gregor Thomas
@Gregor Pourriez-vous s'il vous plaît relire tout avant d'appuyer sur le bouton de vote négatif? !!! la fonction require () et library () font presque la même chose (au moins dans ce cas), donc le paquet est déjà chargé !! Je ne suis pas responsable de votre manque d'informations !!
Mehrad Mahmoudian
8

Lorsque vous effectuez des allers-retours entre les scripts, il peut parfois être nécessaire de décharger un package. Voici une simple instruction IF qui empêchera les avertissements qui s'afficheraient si vous tentiez de décharger un paquet qui n'était pas actuellement chargé.

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

L'inclure en haut d'un script peut être utile.

J'espère que cela fait votre journée!

dca
la source
8

detach(package:PackageName) fonctionne et il n'est pas nécessaire d'utiliser des guillemets.

Alper Gur
la source
3

Vous pouvez essayer tout ce que vous voulez supprimer un package (et toutes les dépendances qu'il a apportées en même temps) en utilisant, unloadNamespace()mais l' empreinte mémoire persistera. Et non, detach("package:,packageName", unload=TRUE, force = TRUE)ça ne marchera pas non plus.

À partir d'une nouvelle console ou Session > Restart Rvérifiez la mémoire avec le pryrpackage:

pryr::mem_used()

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

Vérifier mon 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   

Chargeons le Seuratpackage et vérifions la nouvelle empreinte mémoire :

library(Seurat)
pryr::mem_used()

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

Utilisons unloadNamespace()pour tout supprimer:

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

Maintenant, vérifiez 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 

Vérifiez l' empreinte mémoire :

pryr::mem_used()

# 173 MB

Lien vers la démonstration de la capture d'écran

Matthew J. Oldach
la source
2

Je voudrais ajouter une solution alternative. Cette solution ne répond pas directement à votre question sur le déchargement d' un paquet mais, à mon humble avis, fournit une alternative plus propre pour atteindre votre objectif souhaité, ce que je comprends, est largement soucieux d'éviter les conflits de noms et d'essayer différentes fonctions, comme indiqué:

principalement parce que le redémarrage de R alors que j'essaye des packages différents et conflictuels devient frustrant, mais il est concevable que cela puisse être utilisé dans un programme pour utiliser une fonction puis une autre - bien que le référencement de l'espace de noms soit probablement une meilleure idée pour cette utilisation

Solution

La fonction with_packageofferte via le withrpackage offre la possibilité de:

attachez un package au chemin de recherche, exécute le code, puis supprime le package du chemin de recherche. Cependant, l' espace de noms du package n'est pas déchargé.

Exemple

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

geom_pointutilisé dans l'exemple n'est pas accessible à partir de l'espace de noms global. Je pense que cela peut être une façon plus propre de gérer les conflits que de charger et décharger des paquets.

Konrad
la source
1

Notez également que vous ne pouvez l'utiliser unload()qu'une seule fois. Si vous l'utilisez une deuxième fois sans library()réexécution, vous obtiendrez l' argument «nom» non valide du message d'erreur peu informatif :

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

Créé le 2020-05-09 par le package reprex (v0.3.0)

Matifou
la source
0

Accédez simplement à la fenêtre SORTIE, puis cliquez sur l'icône Packages (elle est située entre les icônes Plot et Help ). Supprimez " coche / coche " du paquet que vous souhaitez décharger.

Pour utiliser à nouveau le package, mettez simplement une " coche ou une coche " devant le package ou utilisez:

library (lme4)
EsKe
la source
1
Sauf si vous avez votre propre chemin de bibliothèque personnalisé. Il n'apparaît pas sous "Packages", vous devez donc suivre les méthodes ci-dessus
zazu