Rcpp - использовать несколько функций С++ в файле, на который ссылается sourceCpp?
Надеюсь, это не слишком очевидно, поскольку я искал весь день и не могу найти ответ.
Скажем, у меня есть следующий R файл:
library(Rcpp)
sourceCpp("cfile.cpp")
giveOutput(c(1,2,3))
И он компилирует следующий файл С++:
#include <Rcpp>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector plusTwo(NumericVector x){
NumericVector out = x + 2.0;
return out;
}
NumericVector giveOutput(NumericVector a){
NumericVector b = plusTwo(a);
return b;
}
Независимо от того, что я пытаюсь, препроцессор Rcpp делает plusTwo()
доступным, а giveOutput()
- совсем не. Документация, которую я смог найти, говорит, что это тот момент, когда нужно создать пакет, но после прочтения виньетки пакета кажется на порядок сложнее, чем мне нужно.
За исключением явного определения plusTwo()
внутри giveOutput()
, что я могу сделать?
Ответы
Ответ 1
Предполагается использовать атрибут экспорта перед каждой функцией, которую вы хотите экспортировать. Поэтому, исправляя файл
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector plusTwo(NumericVector x){
NumericVector out = x + 2.0;
return out;
}
// [[Rcpp::export]]
NumericVector giveOutput(NumericVector a){
NumericVector b = plusTwo(a);
return b;
}
Я получаю желаемое поведение:
R> sourceCpp("/tmp/patrick.cpp")
R> giveOutput(1:3)
[1] 3 4 5
R> plusTwo(1:3)
[1] 3 4 5
R>
О, и создание пакета так же просто, как вызов Rcpp.package.skeleton()
(но прочитайте его страницу справки, особенно для аргумента attributes
). Я знаю, по крайней мере, один пакет CRAN, который начался с того, как вы сюда начали, и явно прошел через Rcpp.package.skeleton()
...