2012-03-01 12 views
27

Il pacchetto R che sto sviluppando richiede diversi oggetti di dati R, come modelli e parametri pre-calcolati.Come gestite i dati R interni a un pacchetto?

Attualmente ho ogni oggetto nella directory 'data' del pacchetto in singoli file .RData. Quando si utilizza il pacchetto, gli utenti possono utilizzare la funzione "dati" per collegare questi oggetti al proprio ambiente.

Il comportamento che vorrei invece sarebbe che al momento del caricamento del pacchetto gli oggetti dati siano automaticamente collegati all'ambiente del pacchetto interno e non accessibili direttamente all'utente.

La mia comprensione è che l'immissione di un file "sysdata.rda" nella directory "R" del pacchetto contenente gli oggetti attualmente in "data" mi darà il risultato desiderato. Tuttavia, esiste un modo per fare in modo che io possa avere ogni oggetto in un file separato invece di raggruppare insieme?

+0

Perché mettere ciascun oggetto in un file separato, perché non fare riferimento a ciascun oggetto separatamente? Ad esempio, 'packagename ::: a' e' packagename ::: b'. –

+0

@the_skua I file separati sono stati utili per semplificare la gestione della versione del file nel pacchetto. Questo è stato un po 'di tempo fa, ma penso che ho avuto adattamenti di modelli diversi come parte del pacchetto e a volte vorremmo aggiornare uno di questi, ma non tutti. – Nixuz

risposta

9

È possibile utilizzare il gancio .onLoad() per chiamare data() durante il caricamento del pacchetto e specificare lo spazio dei nomi del pacchetto come ambiente in cui caricare gli oggetti dati.

Supponendo di avere i file model1.R e mydata.RData nella data/ directory del vostro pacchetto chiamato foopkg, definire la funzione

.onLoad <- function(libname, pkgname) { 
    data("model1", "mydata", package=pkgname, envir=parent.env(environment())) 
} 

da qualche parte nel vostro pacchetto (ad esempio in foopkg-package.R).

Dopo aver costruito e installato il pacchetto,

> library(foopkg) 
> ls(loadNamespace("foopkg")) 

dovrebbe dimostrare che i vari oggetti di dati sono stati caricati con successo nello spazio dei nomi pacchetto, cioè visibile a funzioni nel pacchetto, ma non inquinare l'ambiente globale.

12

Inserire il file sysdata.rda nella directory data del pacchetto.

Non utilizzare pigro dati - file DESCRIZIONE deve o non ha una linea per LazyData, o, se lo fa, dovrebbe essere LazyData: no

In qualsiasi file .R nella directory R del pacchetto aggiungere una linea come questa

data(sysdata, envir=environment()) 

ho creato un data.frame chiamato sysdata ed è salvato in un file chiamato sysdata.rda nella directory dei dati di un pacchetto chiamato anRpackage

Ho aggiunto la riga sopra a un file .R e ho anche aggiunto questa funzione non illustrata solo per mostrare che le funzioni nel pacchetto hanno accesso ai dati.

foo <- function() tail(sysdata, 2) 

poi vedo il seguente una sessione di R

> library(anRpackage) 
> sysdata 
Error: object 'sysdata' not found 

> anRpackage:::sysdata 
    A B C 
1 1 6 a 
2 2 7 b 
3 3 8 c 
4 4 9 d 
5 5 10 e 

> anRpackage:::foo() 
    A B C 
4 4 9 d 
5 5 10 e 

Così, gli utenti hanno ancora accesso ai dati, ma come da voi richiesto, non hanno diretta accesso. L'utente ha ancora la possibilità di eseguire data(sysdata).

+3

Questa risposta non risponde alla domanda. Sto chiedendo la divisione dei dati in file diversi, non riguardo l'ambito dell'accessibilità dei dati. – Nixuz

+1

Si dice che al momento ci siano molti file di dati nella directory dei dati. Quindi, aggiungi una riga come 'data (sysdata, envir = environment())' per ciascuno di questi file di dati in modo che siano "automaticamente collegati all'ambiente del pacchetto interno e non accessibili direttamente all'utente". Per favore chiarisci cosa vuoi – GSee

Problemi correlati