2013-01-13 6 views
9

Moje ostatnie zgłoszenie do CRAN zostało odrzucone, ponieważ mam przypisane do globalnego środowiska, które jest teraz mile widziane.Aktualizowanie wbudowanych danych, na przykład sysdata.rda

Mam osadzony zestaw danych (sysdata.rda), który zawiera parametry konfiguracji oparte na stanie (jak w Stanach Zjednoczonych), w którym przebywa użytkownik. Chciałem, aby ten osadzony zestaw danych był aktualizowalny, gdy nowy użytkownik korzysta z programu. Poprzednio aktualizowałem te dane w początkowej funkcji, z której korzysta użytkownik, i udostępniłem ją użytkownikowi poprzez globalne przypisanie.

Staram się dowiedzieć, jak zaktualizować te osadzone dane i ustawić je jako domyślne dane używane przez użytkownika do końca sesji.

Poprzednio mieściłem dane w/data i ostatnio zmieniłem je na /R/sysdata.rda, ponieważ wydawało się bardziej odpowiednie dla tego locale. Teraz nie jestem tego taki pewien.

Każda pomoc mile widziana

+0

Czy chcesz zapytać, który stan ma miejsce po zainstalowaniu w paczce lub przy każdym ładowaniu paczki? – hadley

+0

Załadują pakiet ze swoimi dostarczonymi danymi i wskazują, z jakiego stanu pochodzą (np. TX). Pakiet rozpoznaje, że ich specyficzne dla stanu parametry nie są częścią osadzonych danych, oblicza je najlepiej, jak potrafi, a następnie dodaje je do osadzonego zestawu danych. Problem, który mam, polega na tym, że zaktualizowany zestaw danych będzie dostępny przez pozostałą część sesji. Zrobiłem to, przypisując go do .GlobalEnv. – dbetebenner

Odpowiedz

4

Kluczem jest wykonanie zadania w środowisku innym niż środowisko globalne. Istnieją dwa podstawowe techniki, wykorzystujące local() i <<- lub jawnie tworzenia nowego środowiska:

pracy z wyraźną środowiska jest prosta: stworzyć środowisko, a następnie przypisać do niego jak listy:

my_opts <- new.env(parent = emptyenv()) 
set_state <- function(value) my_opts$state <- value 
get_state <- function() my_opts$state 

Korzystanie local() jest trochę bardziej skomplikowane i wymaga pewnych sztuczek z <<-

set_state <- NULL 
get_state <- NULL 

local({ 
    state <- NULL 
    get_state <<- function() state 
    set_state <<- function(value) state <<- value 
}) 

Aby uzyskać więcej informacji o tym, jak <<- prace zobaczyć https://github.com/hadley/devtools/wiki/environments, w sekcji "Przyporządkowanie: powiązanie z wartościami".

+0

Bardzo pomocny! Poszedłem na pierwszą trasę. Jeśli funkcja nie znajdzie danych stanu, tworzy środowisko i wypełnia gałąź tego stanu w osadzonych danych (duża lista z odgałęzieniem dla każdego stanu). Zaktualizowane dane są następnie przypisywane do nowego środowiska.Teraz mam problem z R CMD check -as-cran za używanie "attach", aby zaktualizowane dane były używane po wyjściu z funkcji. Nie jestem pewien, jak obejść ten problem. – dbetebenner

+0

Zamiast używać 'attach', wystarczy napisać funkcję, która uzyskuje dostęp do żądanych danych i wywołać to w całym kodzie. – hadley

+0

Hmmm. Muszę czegoś przegapić. Dane (nazwijmy to "internal_data") są rozszerzone w wywołaniu funkcji. Nie jestem pewien, jak uzyskać "internal_data" z tej funkcji (nie chcę przekazać go z powrotem jako część tego, co funkcja zwraca, ponieważ nie jest punktem funkcji). Moje obecne rozwiązanie dla biednych (które przechodzi kontrolę R CMD --as-cran to zapisanie obiektu, a następnie załadowanie go do pliku .GlobalEnv. – dbetebenner

1

Dlaczego nie masz plik foo.R w /data który ładuje dane i aktualizuje je, gdy użytkownik wywołuje data(foo)? Jest to jeden z dozwolonych opcji /data, ale należy pamiętać, że z Writing R Extensions

Należy pamiętać, że kod R powinno być „samowystarczalna”, a nie skorzystać z dodatkowej funkcjonalności dostarczanej przez pakiet, tak, że plik danych może być również używany bez konieczności ładowania opakowania.

Jeśli można żyć z tym ograniczeniem następnie data(foo) może załadować dane, aktualizować je i upewnić się, że jest w określonej nazwie obiektu, który następnie odnosić się w swoich funkcjach.

+0

Nie uznano za plik * .R w/data. Dam ci spin – dbetebenner

Powiązane problemy