2012-03-01 16 views
27

Pakiet R, który tworzę, wymaga kilku obiektów danych R, takich jak wstępnie obliczone modele i parametry.Jak radzisz sobie z danymi R w pakiecie?

Obecnie każdy obiekt znajduje się w katalogu "data" pakietu w osobnych plikach .RData. Podczas korzystania z pakietu użytkownicy mogą korzystać z funkcji "danych", aby dołączyć te obiekty do swojego środowiska.

Zachowanie, które chciałbym zamiast tego byłoby, że przy ładowaniu pakietu obiekty danych są automatycznie dołączane do wewnętrznego środowiska pakietu i nie są dostępne dla użytkownika bezpośrednio.

Rozumiem, że umieszczenie pliku "sysdata.rda" w katalogu "R" pakietu zawierającego obiekty znajdujące się w "danych" da mi pożądany wynik. Czy istnieje jednak sposób, aby to zrobić, aby każdy obiekt mógł znajdować się w osobnym pliku, zamiast grupować?

+0

Po co umieszczać każdy obiekt w osobnym pliku, dlaczego nie odnosić się do każdego obiektu osobno? Np .: "nazwa_pakietu ::: a" i "nazwa_pakietu ::: b". –

+0

@the_skua Oddzielne pliki były przydatne do łatwiejszego zarządzania wersjami plików w pakiecie. To było jakiś czas temu, ale wydaje mi się, że miałem inne modele pasujące do pakietu i czasami chcielibyśmy zaktualizować jeden z nich, ale nie wszystkie. – Nixuz

Odpowiedz

9

Możesz użyć haka .onLoad(), aby wywołać data() podczas ładowania pakietu i określić przestrzeń nazw pakietu jako środowisko do ładowania obiektów danych.

Zakładając masz pliki model1.R i mydata.RData w katalogu data/ swojego pakietu zwanego foopkg zdefiniować funkcję

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

gdzieś w pakiecie (np w foopkg-package.R).

Po budowy i instalowania pakietu

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

powinien wykazać, że różne przedmioty dane zostały pomyślnie załadowane do nazw pakietu, tj widoczne funkcji w pakiecie, ale nie zanieczyszczających środowiska globalnego.

12

Umieść swój plik sysdata.rda w katalogu swojej paczki na numer data.

Nie używaj Lazy danych - plik OPIS powinna albo nie mieć linię dla LazyData, lub, jeśli tak, to powinien on być LazyData: no

w dowolnym pliku .R w katalogu R pakiecie dodaj linię taką jak ta

data(sysdata, envir=environment()) 

stworzyłem data.frame nazwie sysdata i zapisać go do pliku o nazwie sysdata.rda w katalogu danych pakietu zwanego anRpackage

Dodałem powyższą linię do pliku .R, a także dodałem tę nieodwiedzoną funkcję tylko po to, aby pokazać, że funkcje w paczce mają dostęp do danych.

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

Wtedy widzę następujące sesji 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 

Tak, użytkownicy nadal mają dostęp do danych, ale jak prosiłeś, nie mają bezpośredniegodostępu. Użytkownik nadal ma możliwość uruchomienia data(sysdata).

+3

Ta odpowiedź nie odpowiada na pytanie. Pytam o podział danych na różne pliki, a nie o zakres dostępu do danych. – Nixuz

+1

Mówisz, że obecnie masz dużo plików danych w katalogu danych. Tak więc dodaj wiersz "dane (sysdata, envir = environment())" dla każdego z tych plików danych, aby były "automatycznie dołączane do wewnętrznego środowiska pakietu i niedostępne dla użytkownika bezpośrednio". Proszę wyjaśnić, co chcesz. – GSee