scollegare tutti i pacchetti mentre si lavora in R


101

Mentre lavoravo per risolvere un altro problema, ho riscontrato questo problema:

Posso rimuovere tutti gli oggetti R:

rm(list = ls(all = TRUE))

Esiste un comando equivalente in grado di scollegare i pacchetti installati durante la sessione di lavoro?

> 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 

Ho provato in questo modo, anche se ha funzionato anche in una soluzione non 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

Quello che sto cercando è qualcosa di globale come:

  rm(list = ls(all = TRUE))

per gli oggetti, aspettati che non rimuova i pacchetti di base allegati

Grazie;


3
Non che la tua domanda non sia valida, ma perché non riavviare R?
Aaron ha lasciato Stack Overflow il

5
@ Aaron perché non dovresti averlo anche tu ;-) Per passare R CMD checkun pacchetto si suppone che si scarichi in modo pulito, quindi R Core si aspetta che questo sia possibile e qualcosa che si potrebbe desiderare di fare.
Gavin Simpson,

@Aaron, penso che a volte potrebbe essere utile lasciare la sessione in corso quando alcuni pacchetti stanno causando o potrebbero causare interferenze, ma sono stati utilizzati nei passaggi precedenti ...
John Clark,

5
Non è possibile riportare R a una nuova lavagna. Ne ho parlato con John Chambers, ed è particolarmente difficile da fare per la registrazione di classe / metodo S4.
Hadley

Risposte:


98

Quindi, qualcuno avrebbe dovuto semplicemente rispondere a quanto segue.

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

(modifica: 6-28-19) Nell'ultima versione di R 3.6.0 si prega di utilizzare invece.

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

Si noti che l'uso di invisibile (*) non è necessario ma può essere utile per evitare che la risposta NULL invii spam verticalmente nella finestra R.

(modifica: 20/09/2019) Nella versione 3.6.1

Può essere utile convertire names(sessionInfo()$loadedOnly)prima i pacchetti caricati solo in pacchetti allegati esplicitamente, quindi scollegare i pacchetti, in questo modo.

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

Si può tentare di scaricare i pacchetti di base tramite $ basePkgs e anche provare a utilizzare unloadNamespace(loadedNamespaces()). Tuttavia, questi in genere sono pieni di errori e potrebbero interrompere funzionalità di base come la sessionInfo()restituzione di soli errori. Ciò si verifica in genere a causa della mancanza di reversibilità nel design della confezione originale. Attualmente timeDatepuò rompersi irreversibilmente, per esempio.


3
Penso che questo meriti un voto positivo per la sua semplicità e non necessita di pacchetti aggiuntivi.
Antonio Serrano

Questo non ha funzionato per me. L'ho eseguito con avvisi, quindi ho eseguito session.info () tutti i pacchetti erano ancora lì.
dxander

1
Sì, nell'ultima versione di R 3.6.0 si dovrebbe invece usare quanto segue. invisible (lapply (paste0 ('package:', names (sessionInfo () $ otherPkgs)), detach, character.only = TRUE, unload = TRUE)) Nota l'uso di invisible (*) non è richiesto ma può impedire il NULL rispondi dallo spamming verticale della finestra.
mmfrgmpds

Utilizzo dei invisible(lapply(paste0('package:', names(sessionInfo()$otherPkgs)), detach, character.only=TRUE, unload=TRUE))risultati in un Error in FUN(X[[i]], ...) : invalid 'name' argumenterrore
dvanic

L'errore Error in FUN(X[[i]], ...)...si verifica spesso quando è presente solo un valore NULL. Si può testare questo con names(sessionInfo()$otherPkgs). Se ritorna NULL, questa è la causa.
mmfrgmpds

57

Per favore prova questo:

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
nel caso in cui hai sbagliato plyre dplyrsembra l'unico modo per andare. Grazie!
JelenaČuklina

29

Eri vicino. Nota cosa ?detachha da dire sul primo argomento namedi detach():

Argomenti:

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’.

Quindi dobbiamo chiamare ripetutamente detach()una volta per elemento di pkg. Ci sono un paio di altri argomenti che dobbiamo specificare per farlo funzionare. Il primo è character.only = TRUE, che consente alla funzione di assumere che namesia una stringa di caratteri - non funzionerà senza di essa. In secondo luogo, probabilmente vogliamo anche scaricare qualsiasi spazio dei nomi associato. Ciò può essere ottenuto impostando unload = TRUE. Quindi la soluzione è, ad esempio:

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

Ecco un esempio completo:

> 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

Se vuoi trasformarlo in una funzione, studia il codice sessionInfo()per vedere come identifica ciò che etichetta come "altri pacchetti allegati:". Combina quel pezzo di codice con l'idea sopra in una singola funzione e sei a casa e asciutto. Lo lascio comunque a te.


12
puoi automatizzarlo aggiungendo pkgs = names(sessionInfo()$otherPkgs)epkgs = paste('package:', pkgs, sep = "")
Ramnath

2
@Ramnath +1 Effettivamente - ma non volevo essere troppo utile ;-)
Gavin Simpson

4
Potresti anche voler aggiungere force=TRUEnel caso in cui i pacchetti abbiano dipendenze.
James,

26

nothing

Può valere la pena aggiungere la soluzione messa a disposizione da Romain François . Una volta caricato il pacchetto nothing, attualmente disponibile su GitHub , scaricherà tutti i pacchetti caricati; come nell'esempio fornito da Romain:

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

require(nothing, quietly = TRUE)

loadedNamespaces()
[1] "base"

Installazione

Con l'uso del devtoolspacchetto:

devtools::install_github("romainfrancois/nothing")

pacman

Un approccio alternativo utilizza il pacmanpacchetto disponibile tramite CRAN:

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

4
Guardando la vignetta ( trinker.github.io/pacman/vignettes/Introduction_to_pacman.html ) forse pacman::p_unload("all")funzionerebbe altrettanto?
chandler

10

Basandosi sulla risposta di Gavin ma non proprio su una funzione completa sarebbe questa sequenza:

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
in qualche modo posso fare lo stesso con una battuta lapply(paste("package:", names(sessionInfo()$otherPkgs), sep=""), detach, character.only = TRUE, unload = TRUE). Non ci arriverei mai senza la tua risposta però!
UFO

4

oppure, se hai RStudio, deseleziona semplicemente tutte le caselle selezionate nella scheda Pacchetti per scollegarle


1
Se hai molti pacchetti caricati, è complicato deselezionarli tutti manualmente.
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()

questo assicurerà che tutti i pacchetti vengano scollegati a parte quelli di base


In che modo è diverso dalla risposta di
@mjaniec

1

Il più delle volte è il problema plyrvs. dplyrUsa questo all'inizio del codice:

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

Quindi ogni volta che lo script viene eseguito, cancella il plyrpacchetto


0

se hai problemi con pacchetti che hanno funzioni con nomi simili in conflitto tra loro, puoi sempre fare riferimento allo spazio dei nomi del pacchetto che è la funzione che vuoi.

pkg_name::function_i_want()

Questo è un commento invece di una risposta alla domanda posta.
Sibo Jiang

Supponiamo che avrei dovuto impostare questo come commento alla precedente risposta plyr v. Dplyr, è possibile spostarlo? Sto ancora imparando le convenzioni qui.
M. Wood

0

Combining bits from various answers gave the most robust solution I could find...

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)
  }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.