détacher tous les packages tout en travaillant dans R

101

Tout en travaillant pour résoudre un autre problème, j'ai eu ce problème:

Je peux supprimer tous les objets R en:

rm(list = ls(all = TRUE))

Existe-t-il une commande équivalente qui peut détacher les packages installés pendant la session de travail?

> sessionInfo()
R version 2.12.2 (2011-02-25)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

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

exiger (ggplot2)

Loading required package: ggplot2
Loading required package: reshape
Loading required package: plyr

Attaching package: 'reshape'

The following object(s) are masked from 'package:plyr':

    round_any

Loading required package: grid
Loading required package: proto

sessionInfo ()

R version 2.12.2 (2011-02-25)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

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

other attached packages:
[1] ggplot2_0.8.9 proto_0.3-9.1 reshape_0.8.4 plyr_1.4 

J'ai essayé de cette façon, même si cela ne fonctionnait pas dans une solution globale:

pkg <- c("package:ggplot2_0.8.9", "package:proto_0.3-9.1", "package:reshape_0.8.4",  "package:plyr_1.4")

 detach(pkg, character.only = TRUE)

Error in detach(pkg, character.only = TRUE) : invalid 'name' argument
In addition: Warning message:
In if (is.na(pos)) stop("invalid 'name' argument") :
  the condition has length > 1 and only the first element will be used

Ce que je recherche, c'est quelque chose de global comme:

  rm(list = ls(all = TRUE))

pour les objets, attendez-vous à ce qu'il ne supprime pas les packages de base attachés

Merci;

John Clark
la source
3
Non pas que votre question ne soit pas valide, mais pourquoi ne pas simplement redémarrer R?
Aaron a quitté Stack Overflow le
5
@Aaron parce que vous ne devriez pas en avoir trop ;-) Passer R CMD checkun paquet est censé se décharger proprement, donc R Core s'attend à ce que ce soit possible et quelque chose que l'on pourrait souhaiter faire.
Gavin Simpson
@Aaron, je pense que parfois, il peut être utile de laisser la session se dérouler lorsque certains paquets provoquent ou pourraient causer des interférences, mais ont été utilisés dans les étapes précédentes ...
John Clark
5
Il n'est pas possible de ramener R à une nouvelle ardoise. J'en ai parlé avec John Chambers, et c'est particulièrement difficile à faire pour l'enregistrement de classe / méthode S4.
hadley

Réponses:

98

Donc, quelqu'un aurait dû simplement répondre à ce qui suit.

lapply(paste('package:',names(sessionInfo()$otherPkgs),sep=""),detach,character.only=TRUE,unload=TRUE)

(edit: 6-28-19) Dans la dernière version de R 3.6.0 veuillez utiliser à la place.

invisible(lapply(paste0('package:', names(sessionInfo()$otherPkgs)), detach, character.only=TRUE, unload=TRUE))

Notez que l'utilisation de invisible (*) n'est pas nécessaire mais peut être utile pour empêcher la réponse NULL de spammer verticalement la fenêtre R.

(edit: 20/09/2019) Dans la version 3.6.1

Il peut être utile de convertir d' names(sessionInfo()$loadedOnly)abord les packages chargés uniquement en packages explicitement attachés, puis de détacher les packages, comme tel.

lapply(names(sessionInfo()$loadedOnly), require, character.only = TRUE)
invisible(lapply(paste0('package:', names(sessionInfo()$otherPkgs)), detach, character.only=TRUE, unload=TRUE, force=TRUE))

On peut tenter de décharger les packages de base via $ basePkgs et également essayer d'utiliser unloadNamespace(loadedNamespaces()). Cependant, ceux-ci sont généralement remplis d'erreurs et pourraient interrompre les fonctionnalités de base telles que le sessionInfo()renvoi d'erreurs. Cela se produit généralement en raison d'un manque de réversibilité dans la conception de l'emballage d'origine. Actuellement timeDatepeut se briser de manière irréversible, par exemple.

mmfrgmpds
la source
3
Je pense que cela mérite des votes positifs en raison de sa simplicité et ne nécessite pas de packages supplémentaires.
Antonio Serrano
Cela n'a pas fonctionné pour moi. Je l'ai exécuté avec des avertissements, puis j'ai exécuté session.info () tous les paquets étaient toujours là.
dxander
1
Oui, dans la dernière version de R 3.6.0, il faut utiliser ce qui suit à la place. invisible (lapply (paste0 ('package:', names (sessionInfo () $ otherPkgs)), detach, character.only = TRUE, unload = TRUE)) Notez que l'utilisation de invisible (*) n'est pas obligatoire mais peut empêcher le NULL répondre de spammer verticalement la fenêtre.
mmfrgmpds
Utilisation des invisible(lapply(paste0('package:', names(sessionInfo()$otherPkgs)), detach, character.only=TRUE, unload=TRUE))résultats dans une Error in FUN(X[[i]], ...) : invalid 'name' argumenterreur
dvanic
L'erreur Error in FUN(X[[i]], ...)...se produit fréquemment lorsqu'il n'y a qu'une valeur NULL présente. On peut tester cela avec names(sessionInfo()$otherPkgs). S'il revient NULL, c'est la cause.
mmfrgmpds
57

Veuillez essayer ceci:

detachAllPackages <- function() {

  basic.packages <- c("package:stats","package:graphics","package:grDevices","package:utils","package:datasets","package:methods","package:base")

  package.list <- search()[ifelse(unlist(gregexpr("package:",search()))==1,TRUE,FALSE)]

  package.list <- setdiff(package.list,basic.packages)

  if (length(package.list)>0)  for (package in package.list) detach(package, character.only=TRUE)

}

detachAllPackages()
mjaniec
la source
4
au cas où vous vous trompiez plyret que dplyrcela semble la seule voie à suivre. Merci!
JelenaČuklina
29

Vous étiez proche. Notez ce qui ?detacha à dire sur le premier argument namede detach():

Arguments:

name: The object to detach.  Defaults to ‘search()[pos]’.  This can
      be an unquoted name or a character string but _not_ a
      character vector.  If a number is supplied this is taken as
      ‘pos’.

Nous devons donc appeler à plusieurs reprises detach()une fois par élément de pkg. Il y a quelques autres arguments que nous devons spécifier pour que cela fonctionne. Le premier est character.only = TRUE, qui permet à la fonction de supposer qu'il names'agit d'une chaîne de caractères - cela ne fonctionnera pas sans elle. Deuxièmement, nous souhaitons probablement également décharger tout espace de noms associé. Ceci peut être réalisé en définissant unload = TRUE. La solution est donc, par exemple:

pkg <- c("package:vegan","package:permute")
lapply(pkg, detach, character.only = TRUE, unload = TRUE)

Voici un exemple complet:

> require(vegan)
Loading required package: vegan
Loading required package: permute
This is vegan 2.0-0
> sessionInfo()
R version 2.13.1 Patched (2011-09-13 r57007)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_GB.utf8       LC_NUMERIC=C             
 [3] LC_TIME=en_GB.utf8        LC_COLLATE=en_GB.utf8    
 [5] LC_MONETARY=C             LC_MESSAGES=en_GB.utf8   
 [7] LC_PAPER=en_GB.utf8       LC_NAME=C                
 [9] LC_ADDRESS=C              LC_TELEPHONE=C           
[11] LC_MEASUREMENT=en_GB.utf8 LC_IDENTIFICATION=C      

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

other attached packages:
[1] vegan_2.0-0   permute_0.7-0

loaded via a namespace (and not attached):
[1] grid_2.13.1     lattice_0.19-33 tools_2.13.1   
> pkg <- c("package:vegan","package:permute")
> lapply(pkg, detach, character.only = TRUE, unload = TRUE)
[[1]]
NULL

[[2]]
NULL

> sessionInfo()
R version 2.13.1 Patched (2011-09-13 r57007)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_GB.utf8       LC_NUMERIC=C             
 [3] LC_TIME=en_GB.utf8        LC_COLLATE=en_GB.utf8    
 [5] LC_MONETARY=C             LC_MESSAGES=en_GB.utf8   
 [7] LC_PAPER=en_GB.utf8       LC_NAME=C                
 [9] LC_ADDRESS=C              LC_TELEPHONE=C           
[11] LC_MEASUREMENT=en_GB.utf8 LC_IDENTIFICATION=C      

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

loaded via a namespace (and not attached):
[1] grid_2.13.1     lattice_0.19-33 tools_2.13.1

Si vous souhaitez en faire une fonction, étudiez le code sessionInfo()pour voir comment il identifie ce qu'il appelle «autres packages attachés:». Combinez ce morceau de code avec l'idée ci-dessus dans une seule fonction et vous êtes à la maison et au sec. Je vous laisse cependant le soin.

Gavin Simpson
la source
12
vous pouvez automatiser cela en ajoutant pkgs = names(sessionInfo()$otherPkgs)etpkgs = paste('package:', pkgs, sep = "")
Ramnath
2
@Ramnath +1 En effet - mais je ne voulais pas être trop utile ;-)
Gavin Simpson
4
Vous pouvez également ajouter force=TRUEau cas où les packages auraient des dépendances.
James le
26

nothing

Il peut être intéressant d'ajouter une solution mise à disposition par Romain François . Une fois chargé, le package nothing, qui est actuellement disponible sur GitHub , déchargera tous les packages chargés; comme dans l'exemple que Romain fournit:

loadedNamespaces()
[1] "base"      "datasets"  "grDevices" "graphics"  "methods"   "stats"
[7] "utils"

require(nothing, quietly = TRUE)

loadedNamespaces()
[1] "base"

Installation

Avec l'utilisation du devtoolspackage:

devtools::install_github("romainfrancois/nothing")

pacman

Une approche alternative utilise le pacmanpackage disponible via CRAN:

pacman::p_unload(pacman::p_loaded(), character.only = TRUE)
Konrad
la source
4
Regarder la vignette ( trinker.github.io/pacman/vignettes/Introduction_to_pacman.html ) fonctionnerait peut pacman::p_unload("all")- être aussi?
chandler
10

S'appuyant sur la réponse de Gavin mais pas tout à fait pour une fonction complète serait cette séquence:

sess.pkgs <- function (package = NULL) 
{   z <- list()
       if (is.null(package)) {
        package <- grep("^package:", search(), value = TRUE)
        keep <- sapply(package, function(x) x == "package:base" || 
            !is.null(attr(as.environment(x), "path")))
        package <- sub("^package:", "", package[keep])
    }
    pkgDesc <- lapply(package, packageDescription)
    if (length(package) == 0) 
        stop("no valid packages were specified")
    basePkgs <- sapply(pkgDesc, function(x) !is.null(x$Priority) && 
        x$Priority == "base")
    z$basePkgs <- package[basePkgs]
    if (any(!basePkgs)) {
        z$otherPkgs <-  package[!basePkgs]
    }
    z
}

lapply(paste("package:",sess.pkgs()$otherPkgs, sep=""), detach, 
                             character.only = TRUE, unload = TRUE)
IRTFM
la source
2
en quelque sorte, je peux faire la même chose avec un one-liner lapply(paste("package:", names(sessionInfo()$otherPkgs), sep=""), detach, character.only = TRUE, unload = TRUE). Je n'y arriverai jamais sans votre réponse!
Ufos
4

ou si vous avez RStudio, décochez simplement toutes les cases cochées dans l'onglet Packages pour détacher

Ajay Ohri
la source
1
Si vous avez beaucoup de paquets chargés, il est difficile de les décocher manuellement.
Sibo Jiang
3
#Detach all  packages
detachAllPackages <- function() {

  basic.packages <- c("package:stats","package:graphics","package:grDevices","package:utils","package:datasets","package:methods","package:base")

  package.list <- search()[ifelse(unlist(gregexpr("package:",search()))==1,TRUE,FALSE)]

  package.list <- setdiff(package.list,basic.packages)

  if (length(package.list)>0)  for (package in package.list) detach(package, character.only=TRUE)

}

detachAllPackages()

cela garantira que tous les packages sont détachés de vos packages de base

jazzie
la source
En quoi est-ce différent de la réponse
@mjaniec
1

La plupart du temps, c'est le problème du plyrvs. dplyrUtilisez ceci au début du code:

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

Ainsi, chaque fois que le script s'exécute, il efface le plyrpackage

Prashant
la source
0

si vous rencontrez des problèmes avec des packages qui ont des fonctions nommées de manière similaire en conflit les unes avec les autres, vous pouvez toujours référencer l'espace de noms du package dont vous voulez la fonction.

pkg_name::function_i_want()
M. Wood
la source
Ceci est un commentaire au lieu d'une réponse à la question posée.
Sibo Jiang
Supposons que j'aurais dû mettre cela en commentaire à la réponse plyr v. Dplyr précédente, est-il possible de la déplacer? J'apprends encore les conventions ici.
M. Wood
0

La combinaison de bits de diverses réponses a donné la solution la plus robuste que j'ai pu trouver ...

packs <- c(names(sessionInfo()$otherPkgs), names(sessionInfo()$loadedOnly))
if(length(packs) > 0){ 
  message('Unloading packages -- if any problems occur, please try this from a fresh R session')
  while(length(packs) > 0){
    newpacks <- c()
    for(packi in 1:length(packs)){
      u=try(unloadNamespace(packs[packi]))
      if(class(u) %in% 'try-error') newpacks <- c(newpacks,packs[packi])
    }
    packs <- newpacks
    Sys.sleep(.1)
  }
}
Charlie
la source