Получение ожидаемого data.frame для проверки этого ожидания

Я хотел бы проверить, возвращает ли функция ожидаемый data.frame. Data.frame слишком велик для определения в файле R (например, с использованием чего-то вроде structure()). Я делаю что-то не так со средами, когда пытаюсь выполнить простое извлечение с диска, например:

test_that("SO example for data.frame retreival", {   
  path_expected <- "./inst/test_data/project_longitudinal/expected/default.rds"
  actual <- data.frame(a=1:5, b=6:10) #saveRDS(actual, file=path_expected)
  expected <- readRDS(path_expected)
  expect_equal(actual, expected, label="The returned data.frame should be correct")
})

Строки выполняются правильно при запуске в консоли. Но когда я запускаю devtools::test(), возникает следующая ошибка, когда rds/data.frame читается из файла.

1. Error: All Records -Default ----------------------------------------------------------------
cannot open the connection
1: withCallingHandlers(eval(code, new_test_environment), error = capture_calls, message = function(c) invokeRestart("muffleMessage"), 
       warning = function(c) invokeRestart("muffleWarning"))
2: eval(code, new_test_environment)
3: eval(expr, envir, enclos)
4: readRDS(path_expected) at test-read_batch_longitudinal.R:59
5: gzfile(file, "rb")

Чтобы это работало, какие корректировки необходимы для среды? Если нет простого способа, то какой хороший способ протестировать большие data.frames?


person wibeasley    schedule 08.04.2015    source источник
comment
Я не использовал это (поэтому не тестировался), но system.file() здесь не применяется? Он позволяет указать пакет, а затем биты пути от базы пакета до файла. Так что path_expected <- system.file("inst", "test_data", "project_longitudinal", expected", "default.rds") попробуй...   -  person Gavin Simpson    schedule 08.04.2015
comment
Это помогло. Я отвлёкся на среды и забыл, что в процессе тестирования меняется рабочий каталог. По какой-то причине у меня возникли проблемы с path_qualified <- base::system.file("inst/test_data/project_longitudinal/expected/dummy.rds", package="REDCapR"). Однако path_qualified <- base::file.path(devtools::inst(name="REDCapR"), "test_data/project_longitudinal/expected/dummy.rds") работает. Если вы опубликуете официальный ответ, указывающий мне на проблему с рабочим каталогом, я с радостью приму его.   -  person wibeasley    schedule 08.04.2015


Ответы (2)


Я предлагаю вам ознакомиться с отличным пакетом ensurer. Вы можете включить эти функции внутрь самой функции (а не как часть набора тестов testthat). Он выдаст ошибку, если фрейм данных (или любой другой объект, который вы хотите проверить) не соответствует вашим требованиям, и просто вернет объект, если он пройдет ваши тесты. Разница с testthat заключается в том, что ensurer создан для проверки ваших объектов во время выполнения, что, вероятно, позволяет обойти всю проблему среды, с которой вы сталкиваетесь, поскольку объект проверяется внутри функции во время выполнения. См. конец этой виньетки, чтобы узнать, как протестируйте фрейм данных на шаблоне, который вы можете сделать настолько подробным, насколько захотите. Вы также найдете множество других тестов, которые можно запустить внутри функции. Похоже, что в данном случае этот подход может быть предпочтительнее testthat.

person Peter Verbeet    schedule 23.04.2015
comment
Спасибо за обращение к более широкой картине, @Peter Verbeet. Я отметил решение пути к файлу как ответ, потому что оно решило эту конкретную проблему более непосредственно. Однако я рад, что узнал о пакете ensurer и планирую использовать его в будущем. Помимо всего прочего в виньетке мне нравится шаблонная идея. Кажется, это отличный способ быстро сделать набор тестов более детализированным. Это позволило бы набору определить, когда возвращенная структура верна, а значения нет (и, таким образом, более прямо указать мне на код проблемы). - person wibeasley; 04.05.2015

Судя по комментарию @Gavin Simpson, проблема связана не со средой, а с путем к файлу. Изменение второй строки сниппета сработало.

path_qualified <- base::file.path(
    devtools::inst(name="REDCapR"),
    test_data/project_longitudinal/expected/dummy.rds"
)  

Расположение файла определяется независимо от того, выполняю ли я отладку в интерактивном режиме или выполняется тест (и, следовательно, находится ли inst в пути или нет).

person wibeasley    schedule 03.05.2015