2013-11-02 3 views
11

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

Я создал функцию в 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; 
} 
+0

Это неясно. Пожалуйста, покажите код, который вы пытаетесь использовать. –

+0

Спасибо. Я понимаю, что вы пытаетесь сделать сейчас. –

+1

Спасибо за обмен кода. То, что вы здесь делаете, не будет работать на простом C++, либо у второго файла C++ нет объявления F1. Как правило, в заголовке должны быть общие объявления. То, что Ромен показал в своем ответе, работает, но должно считаться взломом. Узнайте о проектах с несколькими файлами на C++. Или держите вещи в одном файле. –

ответ

8

Просто поместите обе функции в тот же файл .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.

3

Пара пунктов: Атрибуты

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

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

  • Rcpp Атрибуты имеют возможность экспорта в C++, см. Rcpp::interfaces() в виньетке.

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

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

Смежные вопросы