2016-03-01 2 views
4

Если я использую devtools::use_vignette("my-vignette") в моей упаковке, работает devtools::build_vignette() работает нормально.devtools build_vignette не может найти функции

Однако, как только я добавляю вызов ко всему из своего пакета, он перестает работать с ошибкой could not find function "myfunc". Если я добавлю звонок library(mypackage), я получу ошибку there is no package called 'mypackage'.

(я должен отметить, что мои чеки пакета, строит & устанавливает совершенно чисто [без каких-либо виньеток], и работает devtools::load_all() также отлично работает для интерактивных сессий.)

Я знаю, что если я построю & установить мой пакет, Затем я смогу создать виньетки. Это кажется действительно неэффективным и опасным способом развития; по сути, заставляя меня перестраивать и переустанавливать весь пакет при каждом фиксации, чтобы проверить, что виньетка не сломается.

Есть ли другой способ получить виньетку для распознавания пакета в процессе?

+1

FWIW: У меня были подобные проблемы и я понял, что не экспортирую свои функции (используя @export в .R-файле, а затем с помощью roxygen, генерирующего NAMESPACE с командами экспорта). Файл NAMESPACE экспортирует функцию, которая не может быть найдена при создании виньетки? – swihart

ответ

3

Если вы используете RStudio IDE (что очень полезно для упаковки Developpement), вы можете сделать ваш документ RMD созданный devtools::use_vignette, нажав на кнопку вязать. Это создаст предварительную версию вашей виньетки. Кстати, RStudio IDE предоставляет вам полезные клавиши и кнопки для выполнения вашего фрагмента документа Rmd куском, чтобы проверить, работает ли он.

Если вы не используете RStudio IDE, вы можете визуализировать документ без создания пакета с помощью функции rmarkdown::render.

Однако для того, чтобы работать, ваша виньетка требует, чтобы ваш пакет был загружен. Итак, как вы сказали, вам придется позвонить library(mypackage), и поэтому ваш пакет должен быть установлен.
Вы можете установить свой пакет без виньетки в командной строке с помощью devtools::install(build_vignette = FALSE). В RStudio IDE, кнопка Build & Reload является enougth для intall вашей package.`

Другим решением для пользователя, не Rstudio IDE является использование devtools::load_all(path to your package) в вашей виньетке для того, чтобы симулировать установку пакета в среде виньетки. Затем вы можете создать свою виньетку с devtools::build vignette, не требуя установки своего пакета раньше.

Я должен подчеркнуть, что виньетка создается автоматически, когда вы создаете свой пакет. Итак, когда разработка закончена, замените в виньете devtools::load_all на library, потому что ваш пакет загружен до создания виньетки при создании пакета.

+0

Я ценю комментарий, но это не отвечало на мой вопрос. – Josh

+0

Так я работаю, когда развиваюсь. Если вы выполните 'devtools :: load_all', тогда выполните все r-фрагменты в своем документе без * создания * виньетки, они будут работать в вашей среде, чтобы ваша функция пакета была найдена. В противном случае 'devtools :: install' +' rmarkdown :: render' должен работать: вы пробовали? Вы также можете попробовать 'devtools :: load_all (path_to_your_package_folder)' в начале виньетки, чтобы имитировать установку при вязании. Стоит попробовать. – cderv

+0

Использование 'devtools :: load_all' работает, хотя и добавляет нежелательную зависимость от devtools. Если вы отредактируете это в своем ответе, я приму это. – Josh

3

Если вы посмотрите пакеты Хэдли Уикхема в github, вы увидите, что он включает в себя библиотеку (xyz) в верхней части своей виньетки, например. https://raw.githubusercontent.com/hadley/dplyr/master/vignettes/data_frames.Rmd

Затем его рекомендуемый способ создания виньеток работы:

http://r-pkgs.had.co.nz/vignettes.html Вы можете построить все виньетки из консоли с Devtools :: build_vignettes(), но это редко бывает полезным. Вместо этого используйте devtools :: build(), чтобы создать пакетный пакет с включенными виньетками.

Я считаю, что это то, что вам нужно будет отправить в CRAN.

Это медленный цикл разработки, поэтому для активного кодирования вы можете вставить строку с devtools :: load_all(), чтобы использовать knit в RStudio.