2012-05-08 20 views
11

Jeśli potrzebuję użyć zestawu danych wewnątrz funkcji (jako tabeli odnośników) wewnątrz tworzonego przeze mnie pakietu, czy muszę jawnie załadować zestaw danych wewnątrz funkcji?Dane wewnątrz funkcji (tworzenie pakietu)

Funkcja i zestaw danych są częścią mojego pakietu.

Czy to jest prawidłowy sposób na wykorzystanie tych danych ustawiony wewnątrz funkcji:

foo <- function(x){ 
    x <- dataset_in_question 
} 

czy to lepiej:

foo <- function(x){ 
    x <- data(dataset_in_question) 
} 

czy jest jakiś podejście nie mam na myśli, że to poprawne ?

+0

Mhh ... użyłbym zastosowanie funkcji w funkcji zamiast i korzystania z funkcji na zbiorze danych, ale może to nie jest opcją w tym przypadku ... – Mikko

+0

jestem prawie pewien, że to opcja (1) . AFAIK, używasz 'data()' dla swoich efektów ubocznych, a nie jego wartości zwracanej. W rzeczywistości zwracana wartość 'data()' jest po prostu nazwą zestawu danych, a nie rzeczywistą zmienną. Spróbuj na przykład 'x <- data (iris)' i zobacz, co się stanie. – Andrie

+0

Jeśli używasz zestawu danych tylko jako tablicy odnośników i nie zmieniając go, czy istnieje potrzeba utworzenia nowego identycznego obiektu? Jeśli zajdzie taka potrzeba, możesz rozważyć dodanie tabeli jako formalnego argumentu do swojej funkcji ('x = dataset_in_question'). – BenBarnes

Odpowiedz

1

Można po prostu umieścić dane określone jako plik .rda w folderze R, opisana przez Hadley'a tutaj: http://r-pkgs.had.co.nz/data.html#data-sysdata

Matthew Jockers używa tego podejścia w syuzhet pa ckage dla zestawów danych, w tym danych bing ustalonych jak widać na ~ linia 452 tutaj: https://github.com/mjockers/syuzhet/blob/master/R/syuzhet.R

bing nie jest dostępna dla użytkownika, ale jest do pakietu wykazany: syuzhet:::bing

Zasadniczo, komenda devtools::use_data(..., internal = TRUE) ustawi wszystko w taki sposób, w jaki jest potrzebne.

+0

use_data jest teraz przestarzałe – jzadra

+1

@jzadra no biggie właśnie został przeniesiony do ** usethis ** pakiet jako 'usethis :: use_data' –

11

Było recent discussion na ten temat (w kontekście rozwoju pakietu) na prace badawczo-devel, liczne punkty, które są istotne w tej kwestii:

  1. Jeśli tylko opcje zapewniają mają zastosowanie do Twój przykład sam R (tj Brian Ripley) powie ci zrobić:

    foo <- function(x){ 
        data("dataset_in_question") 
    } 
    
  2. podejście to jednak rzucić notatkę w czeku R CMD których można uniknąć w nadchodzących wersjach R (lub aktualnie R devel) za pomocą t on globalVariables() funkcja, added by John Chambers

  3. Podejście „poprawny” (to znaczy jeden popierane przez Brian Ripley i Peter Dalgaard) byłoby użyć opcji LazyData dla swojego pakietu. Zobacz this section of "Writing R Extensions".

Btw: Nie do końca rozumiem, jak powinno działać pierwsze podejście. Co powinien zrobić x <- dataset_in_question? Czy dataset_in_question jest globalną zmienną lub zdefiniowaną wcześniej?

1

Dla mnie było to niezbędne do korzystania z get() dodatkowo LazyData: true w DESCRIPTION pliku (patrz postig przez @Henrik pkt 3), aby pozbyć UWAGA no visible binding for global variable .... Moja wersja R to 3.2.3.

foo <- function(x){ 
    get("dataset_in_question") 
} 

Więc LazyData sprawia dataset_in_question dostępne bezpośrednio (bez użycia data("dataset_in_question", envir = environment())) i get() jest zaspokojenie R CMD check

HTH