Пример входных данных с примером вывода с использованием относительного пути в виньетке пакета R?
Я собираю пакет R. Я хотел бы показать пример кода в виньетке, где примерные файлы данных (включенные в пакет) используются для создания выходного файла (пример).
Я читал об использовании данных примера в сообщении Хэдли Уикхэма (http://r-pkgs.had.co.nz/data.html), и считаю, что я должен хранить данные моего примера как сырые данные, поскольку он должен быть проанализирован для генерации вывода.
Итак, я создал каталог в моей структуре пакета
/Users/userName/myPackage/inst/extdata/
с подкаталогами InputFiles и OutputFiles.
И я помещаю пример файла (exampleData.csv) внутри подкаталога InputFiles (/Users/userName/myPackage/inst/extdata/InputFiles).
Моя виньетка расположена в:
/Users/userName/myPackage/vignettes/myPackage.Rnw
Он содержит следующий синтаксис:
<<eval=FALSE>>=
fileString = "/Users/userName/myPackage/inst/extdata/InputFiles/exampleData.csv"
doFunction1(fileString)
doFunction2(fileString)
doFunction3(fileString, output ="Users/userName/myPackage/inst/extdata/OutputFiles")
@
У меня возникают две проблемы с разработкой этой виньетки и ее примерных наборов данных:
1) Я не уверен, подходит ли мое использование файла extdata. Это, по-видимому, лучшее имя и местоположение каталога для размещения моих файлов примеров в соответствии с вышеупомянутой ссылкой Хэдли Уикхема.
2) Я не уверен, как сделать пути относительными, а не абсолютными, поскольку у меня есть их в настоящее время. Этот примерный код не запускается автоматически, как вы можете видеть. Вместо этого я использую его под фрагментом R eval = FALSE, чтобы он просто был указан там, чтобы пользователи могли сами себя протестировать. После запуска кода примера пользователи также могут проверить, действительно ли был создан выходной файл (/Users/userName/myPackage/inst/extdata/OutputFiles). Каков наилучший способ для меня позволить пользователю не использовать абсолютный путь, следуя примеру? Можно ли просто следовать относительному пути из каталога пакетов myPackage?
Мои файлы данных состоят из файлов .csv,.htm и .text. В прошлом при создании пакета я сохранил фрейм данных как файл .rda, а затем пользователь мог просто использовать:
data(example.rda)
чтобы прочитать этот файл. Им не пришлось бы писать весь путь. Есть ли аналогичная функция, которая может использоваться для чтения файлов .csv,.html и .text, а затем выводить их в примерное местоположение вывода - без использования полного пути? Можно ли иметь вспомогательные функции, которые также читаются во входных файлах и записываются в выходные файлы? Повлияет ли это на конфликт в CRAN, если различные справочные функции в папке /man физически сохраняют выходной файл примера в примерную папку вывода?
Ответы
Ответ 1
Стандартный способ обращения к файлу в пакете:
# gives root package directory
system.file(package="myPackage")
# specific file
system.file("extdata/InputFiles/exampleData.csv", package="myPackage")
# best is to use cross-platform way to write a file path:
system.file("extdata", "InputFiles", "exampleData.csv", package="myPackage")
При разработке с devtools
подкаталог inst
игнорируется, поэтому вам не нужно беспокоиться об абсолютных путях. Это должно работать в виньетке. Обратите внимание, что виньетка, я думаю, только когда-либо использует установленную версию пакета, а не ту, которую вы, возможно, загрузили в среду разработки (в частности, devtools::load_all()
не меняет код, который используется для создания виньетки, вы должны install()
сначала).
Наконец, использование data()
немного устарело. Хэдли и другие рекомендуют использовать ленивые данные, поэтому данные появляются в пространстве имен автоматически. Попробуйте следующее в DESCRIPTION
.
LazyData: true
LazyDataCompression: xz