Czy możliwe jest użycie danych pakietu R w testach czy uruchamianiu examples()?

Pracuję nad stworzeniem pakietu R, używając devtools, testthat i roxygen2. Mam kilka zestawów danych w folderze data (foo.txt i bar.csv).

Moja struktura plików wygląda tak:

/ mypackage
    / data
        * foo.txt, bar.csv
    / inst
        / tests
            * run-all.R, test_1.R
    / man
    / R

Jestem prawie pewien, że ' foo ' i ' bar ' są poprawnie udokumentowane:

    #' Foo data
    #'
    #' Sample foo data
    #'
    #' @name foo
    #' @docType data
    NULL
    #' Bar data
    #'
    #' Sample bar data
    #'
    #' @name bar
    #' @docType data
    NULL

Chciałbym wykorzystać dane z "foo" i " bar " w moich przykładach dokumentacji i testach jednostkowych.

Na przykład, chciałbym wykorzystać te zestawy danych w moim teście powołanie:

    data(foo)
    data(bar)
    expect_that(foo$col[1], equals(bar$col[1]))

I chciałbym, aby przykłady w dokumentacji wyglądały tak:

    #' @examples
    #' data(foo)
    #' functionThatUsesFoo(foo)

Jeśli próbuję wywołać data (foo) podczas tworzenia pakietu, pojawia się błąd "data set 'foo' not found". Jeśli jednak zbuduję pakiet, zainstaluję go i załaduję - wtedy testy i przykłady będą działać.

Moje obecne prace nie powinny być uruchamiane na przykładzie:

    #' @examples
    #' \dontrun{data(foo)}
    #' \dontrun{functionThatUsesFoo(foo)}

I w testach, wstępnie załadować dane za pomocą ścieżki specyficznej dla mojego lokalnego komputer:

    foo <- read.delim(pathToFoo, sep="\t", fill = TRUE, comment.char="#")
    bar <- read.delim(pathToBar, sep=";", fill = TRUE, comment.char="#"
    expect_that(foo$col[1], equals(bar$col[1]))
To nie wydaje się idealne-zwłaszcza, że współpracuję z innymi-wymaganie od wszystkich współpracowników, aby mieli te same pełne ścieżki do " foo " i "bar". Ponadto przykłady w dokumentacji wyglądają tak, jakby nie można ich uruchomić, nawet jeśli po zainstalowaniu pakietu mogą. Jakieś sugestie? Wielkie dzięki.
Author: ldecicco, 2012-01-17

2 answers

Importowanie plików innych niż RData w przykładach / testach

Znalazłem rozwiązanie tego problemu, zerkając na pakiet JSONIO, który oczywiście potrzebował podać kilka przykładów odczytu plików innych niż te z.Odmiana RData.

Mam to do pracy w przykładach na poziomie funkcji i spełniają zarówno R CMD check mypackage, jak i testthat::test_package().

(1) Przeorganizowanie struktury pakietu tak, aby przykładowy katalog danych znajdował się w inst. W pewnym momencie R CMD check mypackage kazał mi się przenieść nie - RDATA Pliki Danych inst/extdata, więc w tej nowej strukturze, który jest również przemianowany.

/ mypackage
    / inst
        / tests
            * run-all.R, test_1.R
        / extdata
            * foo.txt, bar.csv
    / man
    / R
    / tests
        * run-testthat-mypackage.R

(2) (Opcjonalnie) Dodaj katalog najwyższego poziomu tests, aby nowy test był uruchamiany również podczas R CMD check mypackage.

Skrypt run-testthat-mypackage.R powinien mieć co najmniej następujące dwie linijki:

library("testthat")
test_package("mypackage")

Zauważ, że jest to część, która umożliwia wywołanie testu podczas R CMD check mypackage, a nie jest to konieczne w przeciwnym razie. Należy dodać testthat jako zależność "sugeruje:" w pliku opisu jako cóż.

(3) na koniec, tajny sos do określenia ścieżki w pakiecie:

barfile <- system.file("extdata", "bar.csv", package="mypackage")
bar <- read.csv(barfile)
# remainder of example/test code here...

Jeśli spojrzysz na wyjście system.file(), zwróci ono pełną ścieżkę systemową do Twojego pakietu w ramach R. Na Mac OS X wygląda to tak:

"/Library/Frameworks/R.framework/Versions/2.15/Resources/library/mypackage/extdata/bar.csv"

Powodem, dla którego wydaje mi się to w porządku, jest to, że nie kodujesz na twardo żadnych funkcji ścieżek innych niż te w pakiecie, więc to podejście powinno być solidne w stosunku do innych instalacji R na innych systemy.

data() podejście

Jeśli chodzi o semantykę data(), o ile mogę powiedzieć, że jest to specyficzne dla plików binarnych R (.RData) w katalogu najwyższego poziomu data. Możesz więc obejść mój przykład powyżej, wstępnie importując Pliki Danych i zapisując je za pomocą polecenia save() do katalogu danych. Zakłada się jednak, że wystarczy tylko pokazać przykład, w którym dane są już załadowane do R, a nie także w sposób powtarzalny demonstrować proces importowania akta.

 17
Author: Paul McMurdie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-21 22:56:33

Za komentarz @hadley, konwersja .RData będzie działać dobrze.

Jeśli chodzi o szerszą kwestię współpracy zespołu z różnymi środowiskami członków zespołu, wspólnym wzorcem jest uzgodnienie jednej zmiennej środowiskowej, np. FOO_PROJECT_ROOT, którą każdy w zespole skonfiguruje odpowiednio w swoim środowisku. Od tego momentu można używać ścieżek względnych, w tym między projektami.

Podejście specyficzne dla R byłoby uzgodnienie niektórych danych / funkcji, które każdy zespół użytkownik utworzy w swoich plikach .Rprofile. Na przykład w ten sposób devtools znajduje pakiety w niestandardowych lokalizacjach.

Wreszcie, choć nie jest to optymalne, możesz umieścić kod specyficzny dla programistów w repozytorium. Jeśli @hadley to robi, to nie jest tak źle. Zobacz na przykład, jak on aktywuje pewne zachowania W testthat we własnym środowisku.

 2
Author: Sim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-20 03:25:22