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. 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.
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.
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