2012-12-19 16 views
6

Chciałbym wiedzieć, czy istnieje sposób na tworzenie funkcji Rcpp przy użyciu pakietów inline w ramach funkcji głównej. Jest to przykład tego, co chcę zrobić:Rcpp + inline - tworzenie i wywoływanie dodatkowych funkcji

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); 
          ") 

co powinno skutkować:

> cpp.fun(a) 
[1] 1 4 9 16 25 36 49 64 81 100 

jednak wiem, że kompilator nie będzie akceptować stworzenie własnej funkcji w głównej metody. Jak mogę utworzyć i wywołać inną funkcję Rcpp z inline bez konieczności przekazywania jej do R?

Odpowiedz

14

body jest dla organizmu funkcji, chcesz spojrzeć na includes argument cxxfunction:

library(inline) 
library(Rcpp) 
a = 1:10 
cpp.fun = cxxfunction(signature(data1="numeric"), 
         plugin="Rcpp", 
         body=' 

IntegerVector fun_data = data1; 
int n = fun_data.size(); 
for(int i=0;i<n;i++){ 
    fun_data[i] = fun1(fun_data[i]); 
} 
return(fun_data); 
', includes = ' 

int fun1(int a1){ 
    int b1 = a1; 
    b1 = b1*b1; 
    return(b1); 
} 

')  
cpp.fun(a) 

?cxxfunction ma szczegółową dokumentację o jego includes argument.

Należy jednak pamiętać, że ta wersja wprowadzi modyfikacje w wektorze wejściowym, co prawdopodobnie nie jest tym, czego potrzebujesz. Inna wersja, która również korzysta z Rcpp wersji sapply:

library(inline) 
library(Rcpp) 
a = 1:10 
cpp.fun = cxxfunction(signature(data1="numeric"), 
         plugin="Rcpp", 
         body=' 

IntegerVector fun_data = data1; 
IntegerVector out = sapply(fun_data, fun1) ; 
return(out); 
', includes = ' 

int fun1(int a1){ 
    int b1 = a1; 
    b1 = b1*b1; 
    return(b1); 
} 

')  
cpp.fun(a) 
a 

Wreszcie, na pewno powinni przyjrzeć się sourceCpp. Dzięki niemu możesz napisać swój kod w pliku .cpp, zawierające:

#include <Rcpp.h> 
using namespace Rcpp ; 

int fun1(int a1){ 
    int b1 = a1; 
    b1 = b1*b1; 
    return(b1); 
} 

// [[Rcpp::export]] 
IntegerVector fun(IntegerVector fun_data){ 
    IntegerVector out = sapply(fun_data, fun1) ; 
    return(out); 
} 

A potem, można po prostu sourceCpp plik i wywołać funkcję:

sourceCpp("file.cpp") 
fun(1:10) 
# [1] 1 4 9 16 25 36 49 64 81 100 
+1

dziękuję za czubka. – honeyoak

+2

Pewnie. Witamy w Stack Overflow. Przygotuj i zaakceptuj tę odpowiedź, jeśli ci odpowiada. (odwiedź http://stackoverflow.com/faq, jeśli nie wiesz co mam na myśli) –

Powiązane problemy