Можно ли использовать данные пакета R в testthat tests или run_examples ()? - PullRequest
31 голосов
/ 17 января 2012

Я работаю над созданием пакета R, используя devtools, testthat и roxygen2.У меня есть несколько наборов данных в папке данных (foo.txt и bar.csv).

Моя структура файла выглядит следующим образом:

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

Я почти уверен, 'foo'и' bar 'задокументированы правильно:

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

Я хотел бы использовать данные в' foo 'и' bar 'в моих примерах документации и модульных тестах.

Например, я хотел бы использовать эти наборы данных в своих тестах, выполнив следующие вызовы:

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

И я хотел бы, чтобы примеры в документации выглядели так:

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

Если я пытаюсь вызвать данные (foo) во время разработки пакета, я получаю сообщение об ошибке «набор данных 'foo' not found".Однако, если я соберу пакет, установлю его и загрузлю - тогда я смогу заставить тесты и примеры работать.

Мои текущие обходные пути - не запускать пример:

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

И в тестах предварительно загружать данные, используя путь, определенный для моего локального компьютера:

    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]))

Это не кажется идеальным - тем более, что я сотрудничаю с другими - требовать, чтобы все соавторы имели одинаковые полные пути к «foo» и «bar».Кроме того, примеры в документации выглядят так, что их невозможно запустить, хотя после установки пакета они могут.

Есть предложения?Большое спасибо.

Ответы [ 2 ]

19 голосов
/ 22 июня 2012

Импорт файлов не-RData в примерах / тестах

Я нашел решение этой проблемы, посмотрев на пакет JSONIO , который, очевидно, должен был предоставить некоторые примеры чтения файлов, отличных отиз серии .RData.

Я получил это для работы на примерах функционального уровня и удовлетворял как R CMD check mypackage, так и testthat::test_package().

(1) Реорганизоватьструктура пакета, так что пример каталога данных находится в пределах inst.В какой-то момент R CMD check mypackage сказал мне переместить файлы данных не-RData в inst/extdata, поэтому в этой новой структуре это тоже переименовывается.

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

(2) (Необязательно) Добавьтекаталог уровня tests, чтобы ваши новые тесты теперь также выполнялись во время R CMD check mypackage.

Сценарий run-testthat-mypackage.R должен содержать как минимум следующие две строки:

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

Примечаниечто это та часть, которая позволяет вызывать testth во время R CMD check mypackage, в противном случае нет необходимости.Вы также должны добавить testthat в качестве зависимости "Suggests:" в файл DESCRIPTION.

(3) Наконец, секретный соус для указания пути внутри пакета:

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

Если вы посмотрите на вывод команды system.file(), она возвращает полный системный путь к вашему пакету в рамках R.В Mac OS X это выглядит примерно так:

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

Мне кажется, это нормально, потому что вы не жестко программируете какие-либо функции пути, кроме тех, которые находятся в вашем пакете, поэтому этот подход должен быть надежным относительнок другим установкам R в других системах.

data() подход

Что касается семантики data(), насколько я могу судить, это относится к двоичным файлам R (.RData)в каталоге верхнего уровня data.Таким образом, вы можете обойти мой пример выше, предварительно импортировав файлы данных и сохранив их с помощью команды save() в вашем каталоге данных.Однако это предполагает, что вам нужно всего лишь показать пример, в котором данные уже загружены в R, в отличие от воспроизводимой демонстрации процесса импорта файлов в восходящем направлении.

2 голосов
/ 20 июня 2012

За комментарий @ hadley, .RData преобразование будет работать хорошо.

Что касается более широкого вопроса о совместной работе команды с различными средами между членами команды, то общая схема состоит в том, чтобы договориться об одной переменной среды, например, FOO_PROJECT_ROOT, которую каждый член команды настроит соответствующим образом в своей среде. С этого момента вы можете использовать относительные пути, в том числе в разных проектах.

R-специфический подход будет заключаться в согласовании некоторых данных / функций, которые каждый член команды будет устанавливать в своих .Rprofile файлах. Например, devtools находит пакеты в нестандартных местах.

И последнее, но не менее важное: хотя это и не оптимально, вы можете поместить код, специфичный для разработчика, в свой репозиторий. Если @hadley делает это, это не так уж плохо. Посмотрите, например, как он активирует определенные поведения в testthat в своем собственном окружении.

...