2011-11-03 14 views
21

Prima di passare a R-2.14, voglio cogliere l'occasione per razionalizzare la struttura delle cartelle dei miei pacchetti installati.Come gestire più posizioni dei pacchetti (cartelle) in R?

Al momento utilizzo il valore predefinito R, ovvero tutti i nuovi pacchetti installati vanno a R_LIBS_USER. Tuttavia, distinguo davvero tra due classi di pacchetti:

  • Pacchetti che uso ripetutamente per svolgere il mio lavoro, ad es. plyr, data.table, ecc
  • Pacchetti installo solo a sperimentare con (spesso per replicare una domanda o una risposta su StackOverflow)

Dal install.packages offre uno la possibilità di specificare un argomento lib, questo è chiaramente possibile.

Esiste un modo semplice per gestire le posizioni dei pacchetti, ad es. creando alcune impostazioni sensibili/funzione wrapper in .RProfile o RProfile.Site?

+1

Ecco [una domanda correlata e utile] (http://stackoverflow.com/questions/2988559/how-do-you-use-multiple-versions-of-the-same-r-package). – Iterator

risposta

24

Ci sono numerose opzioni per questo. La prima cosa che ho fatto è stata adattare il mio Rprofile.site per contenere la seguente riga, rendendo il mio percorso di libreria predefinito una directory non inclusa nella mia installazione R.

.libPaths(c("D:/R/Library",.libPaths())) 

Questo rende D:/R/Library mio percorso di default senza perdere gli altri percorsi. È possibile aggiungere due percorsi a quello, ad esempio D:/R/Library/Work e D:/R/Library/Test. Quello che viene messo nella prima posizione è quello predefinito usato se non si specifica lib in install.packages().

Quindi puoi assegnare due variabili nel tuo .Rprofile.site. Questi sono assegnati nello spazio dei nomi di base, e quindi sempre accessibili e non rimossi da ls(). Qualcosa di simile

.libwork <- 'D:/R/Library/Work' 
.libtest <- 'D:/R/Library/Test' 

, che permette di installare pacchetti come:

install.packages('aPackage',lib=.libwork) 

ci sono anche altre opzioni credo, ma questo è come vorrei rotolare.

+0

+1 Ottimi consigli, Joris. –

+3

Una nota di avviso quando si utilizza questo approccio: questo porta a complicazioni quando si cerca di controllare/compilare/installare pacchetti con 'R CMD check ...'. Il motivo è che 'R CMD check' e' R CMD build' non leggono '.Rprofile' (http://cran.r-project.org/doc/manuals/R-exts.html#Checking-and- edificio-pacchetti). – Andrie

4

Si suppone che sia possibile specificare diversi percorsi/alberi di libreria tramite un elenco di percorsi separati da due punti nella variabile ambientale R_LIBS. Non ho potuto farlo funzionare in modo affidabile su R 2.13.1-patchato - prende sempre e solo la prima volta. Ho ottenuto R_LIBS e R_LIBS_USER per funzionare in modo affidabile sul mio sistema - Normalmente ho impostato solo il primo.

.libPaths() può aggiungere nuovi percorsi all'insieme di alberi della libreria ricercati. Vorrei semplicemente aggiungere le chiamate appropriate a .libPaths(new) nel mio .Rprofile per aggiungere gli alberi rilevanti per ogni sessione. Quindi puoi scegliere dove installare i pacchetti al momento dell'installazione, ovvero quale albero utilizzare. eccellente pacchetto

+0

La stessa esperienza qui. Ecco perché uso il .libPaths() per impostarli. Anche perché install.packages() prende come valore predefinito il primo valore di .libPaths(). Ho appena trovato più facile che manipolare le variabili ambientali. –

2

Per rispondere, devo dare un po 'di contesto.

Per motivi di riproducibilità, provo a scrivere script, compresa la mia intera configurazione R. Ho uno script "initializeR.r" che, tra le altre cose, installa pacchetti, e ho organizzato pacchetti in bundle, come quelli relativi alla cache, quelli relativi alla visualizzazione, campionamento, statistiche spaziali, ecc. - il mio piccolo viste di attività, se vuoi.

Per esempio, ecco un frammento:

# Profiling & testing 
Packages$CodingTools = c("codetools","debug", "profr","proftools","RUnit") 

combino alcuni dei fasci in un pacchetti "importanti" (o primario) lista e altri vanno nella lista "Secondario". Sono sicuro di installare tutto sulla lista primaria - questi sono necessari per avere un ambiente R ragionevole, per usare i miei script, funzioni e pacchetti, ecc. (A proposito, alcuni pacchetti sono assegnati a più bundle, ma solo a pochi; I de-dupe prima di elaborare un elenco aggregato.)

Quindi specificare una libreria predefinita specifica della piattaforma e installare lì. Tuttavia, questa capacità è estendibile e questa idea può essere estesa per includere posizioni opzionali per ciascun pacchetto (o pacchetto): basta mappare dal nome del bundle, ad es. "CodingTools" in una directory univoca (percorso della libreria), pronunciare "D:/R/Library/CodingTools". Questo può essere fatto nello script di inizializzazione, con gli elenchi corrispondenti & opzioni predefinite, o le posizioni possono essere memorizzate altrove, come una tabella hash, JSON o un database.

Come altri hanno già detto, i percorsi di libreria predefiniti devono essere comunicati a R. Ciò può essere fatto in .RProfile.site. Nel mio caso, ho un altro script che viene utilizzato per inizializzare l'istanza R come mi piacerebbe. Cerco di evitare i file di parametri esterni che vengono letti da R (ad esempio .Rprofile), e invece eseguo tutte le inizializzazioni tramite chiamate di funzione nel mio pacchetto (sebbene i parametri siano ancora esterni). Questo tende a rendere più facile per me il debug e riprodurre il mio lavoro. Quindi, i miei percorsi di libreria possono essere inclusi nello stesso tipo di JSON in cui vengono specificate le posizioni dei miei file di dati.

Personalmente, voglio sfuggire alla definizione dei bundle all'interno dello script e utilizzare invece JSON, in quanto posso creare più facilmente file JSON diversi per diverse configurazioni di installazione. Lo faccio già per la maggior parte degli altri scopi del lavoro riproducibile.

Problemi correlati