2014-05-07 15 views
8

Wziąłem ten przykład z innego pytania. Buduję pakiet R z Rcpp. Mam funkcję podobną do fun1 (poniżej), którą chcę wstawić do własnego pliku .cpp. Następnie chcę zadzwonić pod numer fun1 z innymi funkcjami (jak na przykład fun()). Chcę fun1 w osobnym pliku, ponieważ zamierzam wywołać go z kilku funkcji Rcpp, które są w różnych plikach .cpp. Czy są pewne oświadczenia i rzeczy, które muszę zrobić, aby funkcja fun1 była dostępna w .cpp gdzie znajduje się fun()? Dziękuję Ci.Wywołanie funkcji Rcpp z innej funkcji Rcpp podczas budowania pakietu R

library(inline) 
library(Rcpp) 
a = 1:10 
cpp.fun = cxxfunction(signature(data1="numeric"), 
        plugin="Rcpp", 
        body=" 
int fun1(int a1) 
{int b1 = a1; 
b1 = b1*b1; 
return(b1); 
} 

NumericVector fun_data = data1; 
int n = data1.size(); 
for(i=0;i<n;i++){ 
fun_data[i] = fun1(fun_data[i]); 
} 
return(fun_data); 
          ") 

Więc dla mojego kodu będę mieć dwa .cpp pliki:

#include <Rcpp.h> 
using namespace Rcpp; 
// I think I need something here to make fun1.cpp available? 

// [[Rcpp::export]] 
Rcpp::NumericVector fun(Rcpp::NumericVector data1) 
{ 
    NumericVector fun_data = data1; 
    int n = data1.size(); 
    for(i=0;i<n;i++){ 
    fun_data[i] = fun1(fun_data[i]); 
    } 
    return(fun_data); 
} 

i drugi .cpp plik:

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
int fun1(int a1) 
{int b1 = a1; 
b1 = b1*b1; 
return(b1); 
} 
+1

To jest naprawdę elementarne użycie C++ i nie ma nic wspólnego z Rcpp. Naucz się używać wspólnego pliku nagłówkowego, który obejmie każda przyzwoita książka w C++ (lub nawet C). –

Odpowiedz

9

dwa możliwe rozwiązania:

do „szybkiej wymiany and-dirty ", rozwiązanie - dołącz deklarację funkcji do pliku, w którym jesteś używać go:

#include <Rcpp.h> 
using namespace Rcpp; 

// declare fun1 
int fun1(int a1); 

// [[Rcpp::export]] 
Rcpp::NumericVector fun(Rcpp::NumericVector data1) 
{ 
    NumericVector fun_data = data1; 
    int n = data1.size(); 
    for(i=0;i<n;i++){ 
    fun_data[i] = fun1(fun_data[i]); 
    } 
    return(fun_data); 
} 

Im bardziej wytrzymałe rozwiązanie: zapis plików nagłówkowych, które deklarują funkcje, które mogą być następnie #include -ed w każdym pliku. Więc może masz plik nagłówka fun1.h w tym samym src katalogu:

#ifndef PKG_FOO1_H 
#define PKG_FOO1_H 

int foo(int); 

#endif 

które można następnie wykorzystać coś jak:

#include <Rcpp.h> 
#include "fun1.h" 
using namespace Rcpp; 

// [[Rcpp::export]] 
Rcpp::NumericVector fun(Rcpp::NumericVector data1) 
{ 
    NumericVector fun_data = data1; 
    int n = data1.size(); 
    for(i=0;i<n;i++){ 
    fun_data[i] = fun1(fun_data[i]); 
    } 
    return(fun_data); 
} 

miarę postępów, będziesz potrzebować, aby dowiedzieć się więcej Umiejętności programowania w języku C++, więc polecam sprawdzenie się pod numerem one of the books here; w szczególności, Accelerated C++ jest wspaniałym wprowadzeniem.

+0

Dziękuję za jasną odpowiedź, działało to doskonale. Wcześniej nie wiedziałem, że .h pliki działały z Rcpp lub gdzie je umieścić. Miałem roczny kurs C++, więc wiele dokumentacji Rcpp jest wciąż niedostępnych. Ale Rcpp jest niesamowity dla MCMC. – user3583481