Функция rcpp вызывает другую функцию rcpp

Я предполагаю, что это простой вопрос, но я новичок в Cpp и застрял.

Я создал функцию в R, используя Rcpp и:

// [[Rcpp::export]]

Я могу вызвать функцию в R, и она работает по назначению. Позвольте называть его F1.

Затем я хочу создать другую функцию F2, используя Rcpp, которая вызывает первую функцию. Я использую стандартный язык вызова функций (т.е. F1(arguments)), и он компилируется через R, когда я использую sourceCpp().

Но когда я пытаюсь вызвать F2 в R, я получаю:

Ошибка в .Primitive( ". Call" ) (

и

отсутствует F2

Первый .cpp файл содержит

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double F1(NumericVector a) {
  int n = a.size();
  double result=0;  // create output vector
  double ss = 0;

  for(int i = 0; i < n; ++i) {
    ss += pow(a[i],2);
  }

  result = ss;
  return result;
}

В другом файле .cpp указано следующее.

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double F2(NumericVector a) {
  double result=0;

  result = F1(a);

  return result;
}

Ответ 1

Просто поместите обе функции в один и тот же файл .cpp или начните работу с пакетом.

Если вы придерживаетесь отдельных файлов .cpp, то F2 не знает о F1. Вы можете перезвонить F1 как функцию R, но это будет не так эффективно, и вам придется иметь дело с преобразованием выходов в double и т.д.

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
double F2(NumericVector a) {
  double result=0;

  // grab the R function F1
  Function F1( "F1" ) ; 
  result = as<double>( F1(a) );

  return result;
}

Но действительно создайте пакет или поместите все свои функции в один и тот же файл .cpp.

Ответ 2

Пара пунктов:

  • Атрибуты Rcpp - это не единственный способ экспортировать функции С++ в R.

  • Атрибуты Rcpp переименовывают функции, используют аргумент verbose=TRUE и видят результат. Эти имена функций рандомизированы, но...

  • Атрибуты Rcpp имеют свойство export-to-С++, см. Rcpp::interfaces() в виньетке.

Итак, если вы хотите придерживаться Атрибутов, которые кажутся одним из способов. Иначе вызовите функцию, которую вы хотите вызвать fworker(), наберите f1() его вызов (и f1() станет доступным в R) и введите f2() call fworker(). Но вы должны быть в состоянии сделать лучше.

В противном случае вы можете, конечно, вернуться к ручному экспорту функции с помощью явно созданной оболочки R.