120 votes

détacher tous les paquets pendant le travail en R

En travaillant à la résolution d'un autre problème, j'ai rencontré ce problème :

Je peux supprimer tous les objets R en :

rm(list = ls(all = TRUE))

Existe-t-il une commande équivalente permettant de détacher les paquets 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 

require(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, bien que même il a travaillé dans pas 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 cherche, c'est quelque chose de global comme.. :

  rm(list = ls(all = TRUE))

pour les objets, s'attendre à ce qu'il ne supprime pas les paquets de base attachés

Merci ;

3 votes

Non pas que votre question ne soit pas valable, mais pourquoi ne pas simplement redémarrer R ?

5 votes

@Aaron parce que vous ne devriez pas avoir à le faire ;-) Pour passer R CMD check un paquet est censé se décharger proprement, donc R Core s'attend à ce que cela soit possible et que l'on puisse souhaiter le faire.

0 votes

@Aaron, je pense que parfois il pourrait être utile de laisser partir la session lorsque certains paquets causent ou pourraient causer des interférences, mais ont été utilisés dans les étapes précédentes ...

116voto

mmfrgmpds Points 1152

Donc, quelqu'un aurait dû simplement répondre à la question suivante.

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.

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

Il peut être utile de convertir les charges uniquement names(sessionInfo()$loadedOnly) pour attacher explicitement les paquets d'abord, et ensuite détacher les paquets, de la manière suivante.

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 essayer de décharger les paquets de base via $basePkgs et aussi essayer d'utiliser unloadNamespace(loadedNamespaces()) . Toutefois, ces méthodes sont généralement entachées d'erreurs et risquent d'interrompre les fonctionnalités de base, comme par exemple sessionInfo() pour ne renvoyer que les erreurs. Cela se produit généralement en raison d'un manque de réversibilité dans la conception du paquet original. Actuellement, timeDate peut se briser de manière irréversible, par exemple.

(edit : 9/24/20) pour la version 4.0.2 Ce qui suit charge d'abord les paquets à tester et donne ensuite une séquence pour détacher complètement tous les paquets sauf le paquet "base" et "utils". Il est fortement recommandé de ne pas détacher ces paquets.

    invisible(suppressMessages(suppressWarnings(lapply(c("gsl","fBasics","stringr","stringi","Rmpfr"), require, character.only = TRUE))))
    invisible(suppressMessages(suppressWarnings(lapply(names(sessionInfo()$loadedOnly), require, character.only = TRUE))))
    sessionInfo()

    #the above is a test

    invisible(lapply(paste0('package:', c("stringr","fBasics")), detach, character.only=TRUE,unload=TRUE))
    #In the line above, I have inserted by hand what I know the package dependencies to be. A user must know this a priori or have their own automated
    #method to discover it. Without removing dependencies first, the user will have to cycle through loading namespaces and then detaching otherPkgs a
    #second time through.
    invisible(lapply(paste0('package:', names(sessionInfo()$otherPkgs)), detach, character.only=TRUE,unload=TRUE))

    bspkgs.nb<-sessionInfo()$basePkgs[sessionInfo()$basePkgs!="base"]
    bspkgs.nbu<-bspkgs.nb[bspkgs.nb!="utils"]
    names(bspkgs.nbu)<-bspkgs.nbu
    suppressMessages(invisible(lapply(paste0('package:', names(bspkgs.nbu)), detach, character.only=TRUE,unload=TRUE)))

    #again this thoroughly removes all packages and loaded namespaces except for base packages "base" and "utils" (which is highly not recommended).

3 votes

Je pense que cela mérite des votes positifs en raison de sa simplicité et ne nécessite pas de paquets supplémentaires.

0 votes

Cela n'a pas fonctionné pour moi. J'ai lancé le programme, j'ai reçu des avertissements, puis j'ai lancé session.info() et tous les paquets étaient toujours là.

1 votes

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 la réponse NULL de polluer verticalement la fenêtre.

63voto

mjaniec Points 150

Essayez ceci, s'il vous plaît :

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

4 votes

Au cas où vous vous tromperiez plyr & dplyr il semble que ce soit la seule solution. Merci !

1 votes

Cela fonctionne pour R 4.0.2, alors que d'autres solutions semblent ne pas fonctionner

29voto

Gavin Simpson Points 72349

Vous étiez proche. Notez ce que ?detach a à dire sur le premier argument name de 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 ce qui permet à la fonction de supposer que name est une chaîne de caractères - il ne fonctionnera pas sans elle. Deuxièmement, nous voulons aussi probablement décharger tout espace de nom associé. Cela 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 voulez transformer cela en une fonction, étudiez le code dans sessionInfo() pour voir comment il identifie ce qu'il étiquette comme "autres paquets joints :". Combinez ce bout de code avec l'idée ci-dessus dans une seule fonction et vous êtes à l'abri. Mais je vous laisse le soin de le faire.

12 votes

Vous pouvez automatiser cela en ajoutant pkgs = names(sessionInfo()$otherPkgs) y pkgs = paste('package:', pkgs, sep = "")

2 votes

@Ramnath +1 En effet - mais je ne voulais pas être trop utile ;-)

4 votes

Vous pouvez également ajouter force=TRUE dans le cas où les paquets ont des dépendances.

28voto

Konrad Points 3100

nothing

Il peut être utile d'ajouter la solution mise à disposition par Romain François . Une fois chargé, le paquet nothing qui est actuellement disponible sur GitHub va décharger tous les paquets chargés, comme dans l'exemple fourni par Romain :

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

require(nothing, quietly = TRUE)

loadedNamespaces()
[1] "base"

Installation

Avec l'utilisation de la devtools paquet :

devtools::install_github("romainfrancois/nothing")

pacman

Une approche alternative utilise pacman disponible via CRAN :

pacman::p_unload(pacman::p_loaded(), character.only = TRUE)

4 votes

En regardant la vignette ( trinker.github.io/pacman/vignettes/Introduction_à_pacman.html ) peut-être pacman::p_unload("all") fonctionnerait aussi bien ?

10voto

BondedDust Points 105234

En s'appuyant sur la réponse de Gavin, mais sans aller jusqu'à une fonction complète, on pourrait avoir 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)

2 votes

Je peux faire la même chose avec une seule ligne. lapply(paste("package:", names(sessionInfo()$otherPkgs), sep=""), detach, character.only = TRUE, unload = TRUE) . Mais je n'y arriverais jamais sans votre réponse !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X