2012-12-28 14 views
13

Sto costruendo un pacchetto per uso interno usando devtools. Mi piacerebbe che il pacchetto caricasse dati da un file/connessione (che differisce a seconda del pacchetto data è stato creato). I dati sono di grandi dimensioni, quindi è preferibile avere un costo un tempo di analisi e caricamento dei dati durante la creazione dei pacchetti.Quali metodi esistono per la distribuzione di un set di dati semi-live con un pacchetto R?

Attualmente, ho un file data.R sotto R/ che assegna i dati alle variabili a livello di pacchetto, i valori vengono assegnati durante l'installazione del pacchetto (o almeno è ciò che sembra accadere). Funziona per lo meno questa configurazione non ideale. Per ottenere che tutte le istanze del pacchetto abbiano gli stessi dati devo distribuire il file di dati con il pacchetto (attualmente viene copiato in inst/ da uno script di supporto prima di creare il pacchetto) invece di averlo semplicemente assemblato insieme. Ci deve essere un modo migliore.

Come ad esempio:

  • generare .rda file durante la costruzione del pacchetto (ma questo non richiede l'esecuzione lo stesso codice durante il pacchetto di installazione)
    • posso fare questo con un Makefile ma che sembra eccessivo
    • Posso avere codice R che viene eseguito solo durante la creazione del pacchetto e non durante l'installazione?
  • eseguire codice R in data/
    • Ma i dati sono munged utilizzando il codice nel pacchetto in questione. Posso rimediare con Collate (credo), ma poi devo mantenere l'ordine di tutti i file .R (ma con quella complessità potrei anche utilizzare un Makefile?)
  • costruire due pacchetti, uno con tutto il codice che voglio, uno con i dati.
  • Cose ovvie e intelligenti a cui non ho pensato.

tl; dr: Quali sono alcuni metodi per aggiungere un'istantanea di dati che cambiano dinamicamente in un pacchetto R congelato per la distribuzione?

+1

sembra che sia utile creare due pacchetti (ci sono altri pacchetti con pacchetti di dati separati - per lo più pacchetti con grandi set di dati) –

+0

@BenBolker questa è la conclusione cui sono giunto, ma ci sono davvero altri ragionevole metodi? – Tyler

+2

Non so, dopo averci pensato un po 'sembra un modo abbastanza ragionevole per farlo; si ottiene l'infrastruttura R (caricamento lento, documentazione, ecc.) e si ottiene un disaccoppiamento tra le versioni delle funzioni e le versioni dei dati. Non conosco molto bene i 'devtools', ma se si stesse utilizzando un repository CRAN personalizzato si potrebbe facilmente eseguire alcune versioni dei pacchetti e includere funzioni wrapper nelle 'funzioni' per consentire agli utenti di installare versioni appropriate del pacchetto 'dati' ... –

risposta

2

Come @BenBolker points out in the comments above, suddividere il set di dati in un altro pacchetto ha precedenti nella comunità (in particolare il pacchetto principale datasets) e offre ulteriori vantaggi.

La separazione delle funzioni dai dati rende inoltre più semplice il lavoro sulle versioni storiche dei dati con le funzioni aggiornate.

Attualmente ho un pacchetto tools-to-munge e un pacchetto things-to-munge. Utilizzando uno script di supporto, è possibile creare lo tools-to-munge e impostare uno Suggests (o Depends) nello DESCRIPTION di entrambi i pacchetti in modo che facciano riferimento alla versione di incremento appropriata dei pacchetti. Dopo aver creato il nuovo pacchetto tools-to-munge, è possibile creare il pacchetto things-to-munge secondo le necessità utilizzando le funzioni nel pacchetto tools-to-munge.

Problemi correlati