2013-07-09 14 views
11

Ispirato da this answer Sto cercando un modo per separare più pacchetti contemporaneamente.Scollegamento di più pacchetti contemporaneamente

Quando carico dire Hmisc,

# install.packages("Hmisc", dependencies = TRUE) 
require(Hmisc) 

R carichi anche survival e splines. La mia domanda è se c'è un modo per scaricare quel gruppo insieme?

Io attualmente faccio qualcosa di simile,

detach(package:Hmisc, unload = T) 
detach(package:survival, unload = T) 
detach(package:splines, unload = T) 

ho provato,

detach(package:c('Hmisc', 'survival', 'splines'), unload = T) 

...

+1

sarei molto cauti nel gruppo distacco, perché è sempre possibile che hai qualche altro pacchetto ** ** in uso, che dipende anche da una delle i pacchetti subordinati. Un po 'come la quasi impossibilità di capire quali DLL di Windows possono essere rimosse in sicurezza quando si disinstalla qualche app :-(. –

+0

@CarlWitthoft, grazie per il tuo commento riflessivo. –

+1

@CarlWitthoft 'detach' controlla le dipendenze e rifiuta di scollega i pacchetti richiesti dagli altri utenti in uso. Puoi forzare questo valore con 'force = TRUE', ma ovviamente è tutto a posto. –

risposta

10

Un'altra opzione:

Vectorize(detach)(name=paste0("package:", c("Hmisc","survival","splines")), unload=TRUE, character.only=TRUE) 
5

?detach esclude esplicitamente la fornitura di un vettore di caratteri (in contrapposizione a scalare, vale a dire più di una libreria da scollegare) come primo argomento, ma è sempre possibile eseguire una funzione di supporto. Questo accetterà più input che possono essere stringhe di caratteri, nomi o numeri. I numeri sono abbinati alle voci nell'elenco di ricerca iniziale, quindi il fatto che l'elenco di ricerca si aggiorni dinamicamente dopo ogni distacco non causerà l'interruzione.

Lo scherzi con eval(substitute(... è necessario perché, a meno che character.only=TRUE, detach gestisce il suo primo argomento in un modo non standard. Verifica se si tratta di un nome e, in tal caso, utilizza substitute e deparse per trasformarlo in carattere. (L'argomento è character.only misnamed davvero, come detach(2, character.only=TRUE) funziona ancora in realtà dovrebbe essere chiamato "accept.names" o qualcosa del genere..)

+0

Grazie. Sentitevi colpevole come avrei dovuto leggere il '' distacco '' con maggiore attenzione Ancora una volta, grazie per la vostra risposta –

+1

@EricFail Nessun motivo per sentirsi in colpa.E 'una buona domanda, e la complessità della risposta indica che non è banale –

+1

ti spieghi perché 'detlist <-c ('Hmisc', 'survival', 'splines'); lapply (detlist, function (k) detach (k, unload = true))' non funziona? La pagina di aiuto dice argomento s quali sono le stringhe sono accettabili per 'staccare '.(ogni argomento è una stringa di un elemento, piuttosto che un vettore di caratteri se lo leggo bene) –

2

Per rispondere alla mia domanda alla risposta di Hong:

detlist<-c('Hmisc','survival','splines') 

lapply(detlist, function(k) detach(paste('package:', k, sep='', collapse=''), unload=TRUE, char=TRUE)) 

Funziona bene. La funzione di ordinamento nella parte superiore di base::detach è un po 'vistosa, ma l'utilizzo di character.only=TRUE mi ha fatto passare bene.

1

Per eliminare tutti i pacchetti attualmente collegati:

lapply(names(sessionInfo()$otherPkgs), function(pkgs) detach(paste0('package:',pkgs),character.only = T,unload = T,force=T)) 
Problemi correlati