2013-02-14 6 views
12

Esiste una posizione predefinita in cui un pacchetto R può memorizzare dati memorizzati nella cache? I dati dovrebbero persistere tra le sessioni. Stavo pensando di creare una sottodirectory di ${R_LIBS_USER}/package_name, ma non sono sicuro se questo è portatile e se questo è "permesso" se il mio pacchetto è installato a livello di sistema.Esiste una posizione permanente che è sempre scrivibile che può essere utilizzata come cache di dati da un pacchetto?

L'idea è la seguente: Creare uno script di R mydata.R nel data sottodirectory del pacchetto, che dovrebbe essere eseguito chiamando data(mydata) (in base alla documentazione di data()). Questo script caricherà i dati da Internet e li memorizzerà nella cache, se non è stato precedentemente memorizzato nella cache. (Se i dati sono già stati memorizzati nella cache, verrà utilizzata la cache.) Inoltre, verrà fornita una funzione per invalidare la cache e/o per verificare se una versione più recente dei dati è disponibile online.

Questo è dalla documentazione di data():

Attualmente, quattro formati di file di dati sono supportati:

  1. file che finiscono '.R' o '.r' sono fonte() d in, con la directory di lavoro R modificata temporaneamente nella directory contenente il rispettivo file. (Dati garantisce che il pacchetto utils è collegata, nel caso fosse stato eseguito tramite utils :: dati.)

  2. ...

Infatti, creando un file fortytwo.R nella data sottodirectory di un pacchetto con il seguente contenuto:

fortytwo = data.frame(answer=42) 

ed eseguendo data(fortytwo) crea una variabile frame di dati fortytwo. Ora la domanda è: dove sarebbe fortytwo.R memorizzare i dati se fosse difficile da calcolare?

EDIT: Sto pensando di creare due pacchetti: un pacchetto "dati" che fornisce i dati e un pacchetto "codice" che opera su di esso. La domanda riguarda il pacchetto "dati": dove può archiviare i file in una memoria per utente in modo che sia persistente nelle sessioni R ed è accessibile da diversi progetti R?

Correlati: Package that downloads data from the internet during installation.

+2

Si potrebbe voler dare un'occhiata a https://github.com/hadley/rappdirs - è una porta di AppDirs, che è una libreria python che tenta di trovare le directory giuste in modo specifico del sistema operativo. – hadley

+0

Solo cercando di chiarire: intendi dove possono essere memorizzati i dati dopo che sono stati elaborati da uno script R? In altre parole, la tua domanda riguarda davvero i dati del pacchetto di dati o i dati che vengono generati come output da qualsiasi elaborazione che ha avuto luogo? * Suona * come il secondo. – A5C1D2H2I1M1N2O1R2T1

+0

@hadley: C'è una possibilità che questo apparirà su CRAN in qualunque momento presto? Se non c'è un modo specifico per farlo (come metterlo in una sottodirectory di $ {R_USER_LIBS}), userò volentieri il tuo pacchetto. – krlmlr

risposta

-2

Hai esaminato i database in memoria? H2 & I redis hanno binding in R tramite RH2 & rredis - entrambi consentono di condividere i dati tra le sessioni r - finché la sessione di creazione non è attiva. per mantenerlo persistente su sessioni non concorrenti, è necessario scrivere i dati sul disco (supponendo che non sia possibile ricrearlo al volo- che vanificherebbe lo scopo di questa domanda), e credo che i dati il pacchetto sarebbe una buona opzione. In questo modo, è possibile aggiungere una funzione di aggiornamento che si inizializza ogni volta che si carica un pacchetto (ad esempio se il pacchetto di codice ha le giuste dipendenze)

Un esempio è RWeka & pacchetti RWekaJars. Cercali su CRAN, e dovrebbe essere abbastanza facile capire come funzionano.

+0

Posso scrivere i dati su disco nel formato nativo di R. Ho solo bisogno di trovare un posto * dove * posso metterli in modo che altre sessioni R lo trovino lì. – krlmlr

+0

Come ho detto, utilizzo i database in memoria. H2 e redis mi servono bene. – jackStinger

1

Non esiste una posizione definita per la cache persistente specifica del pacchetto in R.Tuttavia, lo R.cache package fornisce un'interfaccia per la creazione e la gestione dei dati memorizzati nella cache. Sembra che potrebbe essere utile per il tuo scenario.

Quando gli utenti caricano R.cache (library(R.cache)), ottengono il seguente messaggio:

The R.cache package needs to create a directory that will hold cache files. 
It is convenient to use one in the user's home directory, because it remains 
also after restarting R. Do you wish to create the '~/.Rcache/' directory? If 
not, a temporary directory (/tmp/RtmpqdUcbP/.Rcache) that is specific to this 
R session will be used. [Y/n]: 

Essi possono quindi scegliere di creare la cartella della cache nella loro home directory, che è presumibilmente persistenti, o per creare un directory specifica della sessione. Se si rende il pacchetto di dati dipendente da R.cache, è possibile verificare l'esistenza degli oggetti memorizzati nella sua funzione di hook .onLoad() e scaricare i dati se non ci sono. In alternativa, puoi farlo nel modo suggerito nella tua stessa domanda.

Problemi correlati