Проблемы со сборкой пакета R с помощью инструментов разработки, когда он использует RcppArmadillo

Это мой первый вопрос о стеке, так что будьте добры, ребята!

Мне очень понравилось мое недавно обретенное умение создавать пакеты R с помощью devtools. Однако, как только я пытаюсь собрать пакет, использующий RcppArmadillo, мой рабочий процесс запуска devtools::document(), devtools::check() и devtools::build() больше не работает.

Например, у меня есть (надеюсь, довольно минимальная + полная) тестовая версия пакета, который я пытаюсь разработать здесь: https://github.com/suztolwinskiward/fooR/. fooR содержит только одну функцию, которая является реализацией C++ функции rdist.earth из пакета fields.

Запуск devtools::document("fooR") выдает множество сообщений (несколько намеков на "неопределенные ссылки" на переменные, которые не живут в моем исходном коде, которые не интерпретируются для меня, а затем терпит неудачу:

    collect2: ld returned 1 exit status
    no DLL was created
    ERROR: compilation failed for package 'fooR'
    * removing 'C:/Users/I53794/AppData/Local/Temp/RtmpWgC8nD/devtools_install_1ea473123086/fooR'
    Error: Command failed (1)

С другой стороны, когда я использую функцию C++, которая зависит от RcppArmadillo, кажется, что она работает нормально:

> Rcpp::sourceCpp('./src/rdist_earth_cpp.cpp')
> data('miami')
> data('new_orleans','katrina_path')
> rdist_earth_cpp(katrina_path,new_orleans)
            [,1]
 [1,] 1042.36073
 [2,]  998.96793
 [3,]  957.69315
 [4,]  917.91486
 [5,]  868.07791
 [6,]  805.73485
 [7,]  763.01476
 [8,]  726.10133
 [9,]  692.14482
[10,]  670.15133
[11,]  662.23353
[12,]  625.55592
[13,]  601.08682
[14,]  579.73940
[15,]  560.32660
[16,]  539.14192
[17,]  510.15438
[18,]  481.40037
[19,]  442.52322
[20,]  391.96619
[21,]  331.66378
[22,]  271.79088
[23,]  201.24749
[24,]  128.12647
[25,]   56.99198
[26,]   45.80297
[27,]   32.96609
[28,]   81.71237
[29,]  189.31050
[30,]  296.92104
[31,]  406.12593
[32,]  516.08458
[33,]  654.81113
[34,]  808.21670

Это заставляет меня думать, что что-то не так с тем, как я пытаюсь использовать RcppArmadillo в своем пакете, но я не смог понять, что именно. Любые советы очень ценятся!

P.S. Я удивлен, что здесь нет тега RcppArmadillo....


person Suz Tolwinski-Ward    schedule 28.10.2015    source источник


Ответы (4)


В дополнение к ответам jtilly и комментарию Дирка:

RcppArmadillo.package.skeleton() генерирует правильный файл пространства имен, но после запуска roxygen2 через document() пространство имен содержит только одну строку

# Generated by roxygen2: do not edit by hand

и директивы DynLib/export перезаписываются. Чтобы позволить roxygen2 автоматически генерировать правильное пространство имен, добавьте новый файл R в подкаталог R каталога вашего пакета, содержащий следующее:

#' @useDynLib YourPackageName
#' @importFrom Rcpp evalCpp
#' @exportPattern "^[[:alpha:]]+"
NULL

Имя этого файла не имеет значения, но для этого (своего рода) «основного файла» обычно используется YourPackageName.r.

При запуске "document()" создается следующий файл пространства имен:

# Generated by roxygen2: do not edit by hand

exportPattern("^[[:alpha:]]+")
importFrom(Rcpp,evalCpp)
useDynLib(YourPackageName)

Это то же самое пространство имен, которое генерируется через RcppArmadillo.package.skeleton() RcppArmadillo 0.6.700.6.0.

person Patrick Roocks    schedule 19.05.2016

Ваш файл NAMESPACE пуст. Он должен содержать что-то вроде этого:

useDynLib(fooR)
exportPattern("^[[:alpha:]]+")
person jtilly    schedule 28.10.2015
comment
... и он будет создан для вас, если вы воспользуетесь такими инструментами, как RcppArmadillo.package.skeleton(), которые мы создали точно, чтобы помочь новичкам в создании пакетов. - person Dirk Eddelbuettel; 28.10.2015
comment
Спасибо вам обоим. Я обязательно изучу RcppArmadillo.packge.skeleton() -- спасибо за его разработку Dirk et al. Обычно devtools::document() создает для меня пространство имен, поэтому я не знаю, почему этот путь не работает, как только я включаю RcppArmadillo. - person Suz Tolwinski-Ward; 28.10.2015

Что в конечном итоге сработало, так это инициализировать новый пакет с помощью RcppArmadillo.skeleton.package, переместить в него все мои предыдущие файлы, документировать вручную, а затем проверить и собрать с помощью кнопок графического интерфейса в RStudio. Это кажется довольно неуклюжим, и мне действительно нравилось использовать roxygen2 гораздо лучше для документации, но, как относительный новичок в разработке пакетов с зависимостью от RcppAmadillo, я просто счастлив, что нашел способ успешной сборки!

person Suz Tolwinski-Ward    schedule 29.10.2015
comment
Хотите верьте, хотите нет, но я тоже начинаю с этой функции для новых проектов. И ничего не мешает вам добавлять комментарии Roxygen в файлы cpp. - person Dirk Eddelbuettel; 30.10.2015
comment
Спасибо, Дирк. Ваша книга только что прибыла в мой почтовый ящик, так что с нетерпением жду новых открытий! - person Suz Tolwinski-Ward; 03.11.2015

'devtools::document()' компилирует ваш код, честно говоря, я не знаю почему. Это означает, что в случае сбоя компиляции документация не завершена. Кажется, в вашем случае это означает, что вы не записали свое ПРОСТРАНСТВО ИМЕН.

Начните, как предлагает Дирк, и добавьте что-нибудь, но оно должно быть скомпилировано до того, как документация будет готова.

person Jack Wasey    schedule 28.10.2015
comment
Я начал, как предложил Дирк, но когда я использую devtools::document(), я получаю предупреждение NAMESPACE not generated by roxygen2. Skipped., а затем сообщение о том, что DLL не загружена. Так что не уверен, как согласовать NAMESPACE из RcppArmadillo.skeleton.package с продолжающейся разработкой пакета с помощью devtools (который предлагает множество других функций, которые мне нравятся, и с которыми я добился успеха, пока не понадобилась быстрая линейная алгебра!) - person Suz Tolwinski-Ward; 28.10.2015