web-dev-qa-db-fra.com

détachez tous les paquets en travaillant dans R

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 permettant de 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 

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, 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 cherche, 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; 

80
John Clark

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

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

S'il vous plaît essayez 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()
48
mjaniec

Tu étais proche. Notez ce que ?detach a à dire à propos du 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 - elle 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 dans 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 en une seule fonction et vous êtes chez vous et au sec. Je vais laisser ce morceau à vous cependant.

30
Gavin Simpson

nothing

Il peut être intéressant d’ajouter la solution proposée par Romain François . Une fois chargé, le package nothing , actuellement disponible sur GitHub , déchargera tous les packages chargés. comme dans l'exemple donné par Romain:

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

require(nothing, quietly = TRUE)

loadedNamespaces()
[1] "base"

Installation

Avec l’utilisation du paquet devtools :

devtools::install_github("romainfrancois/nothing")

pacman

Une approche alternative utilise pacman package disponible via CRAN:

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

Construire sur la réponse de Gavin mais pas tout à fait à 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)
8
42-

ou si vous avez RStudio, décochez simplement toutes les cases dans l’onglet Packages

3
Ajay Ohri

La plupart du temps, c'est le problème plyr vs dplyr. Utilisez ceci au début du code:

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

Ainsi, chaque fois que le script est exécuté, le package plyr est effacé.

1
Prashant

si vous rencontrez des problèmes avec des packages dont les fonctions portant le même nom sont en conflit, vous pouvez toujours référencer l’espace de nom du package qui correspond à la fonction souhaitée.

pkg_name::function_i_want()
0
M. Wood