Функция 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.