В настоящее время у меня есть файл .cpp
, который я могу скомпилировать с помощью sourceCpp()
. Как и ожидалось, создается соответствующая функция R, и код работает так, как ожидалось.
Вот он:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector exampleOne(NumericVector vectorOne, NumericVector vectorTwo){
NumericVector outputVector = vectorOne + vectorTwo;
return outputVector;
}
Теперь я конвертирую свой проект в пакет с помощью Rcpp
. Поэтому я создал скелет с rStudio и начал смотреть, как конвертировать вещи.
В Hadley отличный праймер на Cpp, он говорит в разделе "Использование Rcpp в пакете":
Если ваши пакеты используют атрибут Rcpp:: export, то добавляется еще один шаг в процессе сборки пакета. Функция compileAttributes проверяет исходные файлы в пакете для атрибутов Rcpp:: export и генерирует код, необходимый для экспорта функций в R.
Вы должны повторно запускать compileAttributes всякий раз, когда функции добавляются, удаляются или изменяются подписи. Обратите внимание: если вы создаете свой пакет с помощью RStudio или devtools, то этот шаг выполняется автоматически.
Итак, похоже, что код, скомпилированный с помощью sourceCpp()
, должен работать так же, как в пакете.
Я создал соответствующий R файл.
exampleOne <- function(vectorOne, vectorTwo){
outToR <- .Call("exampleOne", vectorOne, vectorTwo, PACKAGE ="testPackage")
outToR
}
Затем я (re) построил пакет, и я получаю эту ошибку:
Error in .Call("exampleOne", vectorOne, vectorTwo, PACKAGE = "voteR") :
C symbol name "exampleOne" not in DLL for package "testPackage"
Кто-нибудь имеет представление о том, что еще мне нужно делать, когда вы делаете код, который компилируется с помощью sourceCpp(), а затем используете его в пакете?
Я должен отметить, что я прочитал: "Написание пакета, использующего Rcpp" http://cran.rstudio.com/web/packages/Rcpp/vignettes/Rcpp-package.pdf, и понять представленную там базовую структуру. Однако, посмотрев исходный код RcppExamples
, кажется, что структура в виньетках не совсем такая же, как в примере пакета. Например, не используются файлы .h. Также ни виньетка, ни исходный код не используют атрибут [[Rcpp:: export]]. Это все затрудняет отслеживание того, где моя ошибка.