Подтвердить что ты не робот

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(), что я могу сделать?

4b9b3361

Ответ 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()...