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;
Donc, quelqu'un aurait simplement dû répondre à ce qui suit.
lapply(paste('package:',names(sessionInfo()$otherPkgs),sep=""),detach,character.only=TRUE,unload=TRUE)
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()
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.
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"
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)
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)
ou si vous avez RStudio, décochez simplement toutes les cases dans l’onglet Packages
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é.
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()