Подтвердить что ты не робот

Можно ли использовать данные пакета R в тестах testthat или run_examples()?

Я работаю над разработкой пакета 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' в моих примерах документации и модульных тестах.

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

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

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

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

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

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

    #' @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". Кроме того, примеры в документации выглядят так, что они не могут быть запущены, хотя после установки пакета они могут.

Любые предложения? Большое спасибо.

4b9b3361

Ответ 1

Импорт файлов без 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, чтобы ваши новые тесты testthat теперь также выполнялись во время R CMD check mypackage.

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

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

Обратите внимание, что это та часть, которая позволяет testthat вызываться во время R CMD check mypackage, а не в противном случае. Вы должны добавить testthat в качестве зависимости "Предлагает:" в файле 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

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

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

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

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