2012-08-06 13 views
10

Czy istnieje ostateczny sposób zapisywania opcji lub informacji dotyczących określonego pakietu między sesjami?Zapisywanie ustawień pakietu między sesjami

Załóżmy na przykład, że ktoś zrobił grę i wypuścił ją jako pakiet R. Jeśli chcieli zapisać wysokie wyniki i nie mieli ich zresetować za każdym razem, gdy R rozpoczął nową sesję, jaki byłby najlepszy sposób na zrobienie tego? Obecnie mogę myśleć tylko o przechowywaniu pliku w katalogu domowym użytkowników, ale nie jestem pewien, czy podoba mi się to podejście.

+0

Nie dla pakietu R per se, ale to jest dość typowe w świecie nix do przechowywania tego rodzaju rzeczy w ukrytym pliku lub ukrytym katalogu w katalogu domowym użytkowników. W oknach można użyć katalogu danych aplikacyjnych lub rejestru. – frankc

+0

Ja sam miałem to samo pytanie, myślę, że klucz może znajdować się w tym wpisie SO tutaj: http://stackoverflow.com/questions/8661526/permanently-replacing-a-function –

+0

"Ktoś zrobił grę i wypuścił ją jako pakiet R "<- Errror, nie parsuje się –

Odpowiedz

4

To może być podejście. I stworzył pakiet atrapa z manekina funkcji (dowolnej funkcji tworzę jest zobowiązany być obojętne funkcja) oraz zbioru danych nazwałem scores że ustawiony następująco:

scores <- NA 

Potem stworzył pakiet z wyników zbiór danych.

Wtedy stosuje się następującą zmianę zestawu danych od wewnątrz R.

loc <- paste0(find.package("new"), "/Data") 
unlink(paste0(loc, "/scores.rda"), recursive = TRUE, force = FALSE) 
scores <- 10 

save(scores, file=paste0(loc, "/scores.rda")) 

Wtedy kiedy wyładowane bibliotekę i ponownie załadowany AĢIN dane określone teraz mówi:

> scores 
[1] 10 

Czy może to być zmodyfikowany, aby robić to, co chcesz? Musiałbyś to zapisać między innymi, ale nie jestem pewien, jak to zrobić bez zakłócania działania funkcji .Last.

EDIT:

Wydaje się, ta opcja nie jest opłacalne, że podczas kompilacji jako pakiet i korzystać leniwy załadować go ratuje zbiory danych jak:

RData.rbd, RData.rbx, nie jako pliki .rda. Oznacza to, że podejście, którego używam powyżej, jest bezwartościowe, ponieważ chcemy, aby było ono automatycznie rozpoznawane.

EDIT2 Podejście to działa i próbowałem go na opakowaniu zrobiłem. Nie możesz wykonać leniwego ładowania danych i musisz wyraźnie użyć data(scores) lub użyć data(scores) w funkcji, do której dzwonisz. Przypisałem również scores do .scores int on global.env przy pierwszym utworzeniu i użyciu exists wewnątrz funkcji, aby sprawdzić, czy istnieje. Jeśli ".scores. Istniałem przypisałem to do wyników w funkcji. Po ponownym wczytaniu biblioteki i przywróceniu jej jeszcze raz nie musisz się już martwić.

Może alternatywą jest, aby zapisać to jako funkcję jakoś, które mogą być zmienione za pomocą porady Josha tutaj: Permanently replacing a function

+0

Jakie jest twoje zdanie na temat '.onUnload'? Nie próbowałem tego, ale powinno być uruchamiane dla wszystkich pakietów, gdy R jest zamknięte, prawda? – Backlin

+3

Możesz ponownie zapisać 'score' w dowolnym momencie, kiedy jest modyfikowany (zakładając, że nie jest to zbyt częste). Wtedy nie musisz się martwić o zapisanie "na końcu" –

+0

Będę musiał się z tym bawić, ale wygląda na to, że zrobi to, co chcę. – Dason

1

Domyślam się, że nie ma sposobu na zapisanie ustawień bez zapisywania ich na dysku lub w bazie danych w taki czy inny sposób. Można to zrobić po cichu, umieszczając poniższy kod na swoim numerze ~/.Rprofile. Jeśli jednak masz pakiety, które zapisują ustawienia w inny sposób niż przy użyciu options, musisz dodać je ręcznie.

Wiem, że to dokładnie to, co powiedziałeś, że nie chcesz, ale to może wywołać przynajmniej debatę.

.Last <- function(){ 
    my.options <- options() 
    save(my.options, file="~/.Roptions.Rdata") 
} 

.First <- function(){ 
    tryCatch({ 
     load("~/.Roptions.Rdata") 
     do.call(options, my.options) 
     rm(my.options) 
    }, error=function(...){}) 
} 

Ku mojemu zdziwieniu try(..., silent=TRUE) daje ostrzeżenie na starcie jeśli ~/.Roptions.Rdata nie istnieje, dlatego użyłem tryCatch zamiast.

+0

Wszelkich pomysłów, jak to zrobić, bez konieczności modyfikacji przez użytkownika .Rprofile? – Dason

+1

Możesz utworzyć pakiet dla niego i umieścić powyższy kod w '.onLoad()' i '.onUnload()' w 'zzz.R', ale wtedy nadal będziesz musiał załadować tę paczkę za każdym razem, gdy zaczniesz R. – Backlin

Powiązane problemy