2012-12-19 44 views
6

我想知道是否有方法在主函數中使用inline包創建Rcpp函數。這是我想要做的一個例子:Rcpp + inline - 創建和調用附加函數

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

這將導致:

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

但是我知道,編譯器將不是主要的方法中接受自己的函數創建。我將如何創建並調用另一Rcpp函數inline而不必將它傳遞給R?

回答

14

body是函數的身體,你想看看cxxfunctionincludes說法:

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有詳細的關於其includes參數文件。

但請注意,此版本將在您的輸入向量中進行修改,這可能不是您想要的。另一個版本也採用的Rcpp版本的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 

最後,你一定要看看sourceCpp。有了它,你會寫你的代碼在.cpp文件,其中包含:

#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); 
} 

然後,你可以sourceCpp文件並調用該函數:

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

謝謝你的提示。 – honeyoak

+2

當然。歡迎使用堆棧溢出。請註冊並接受這個答案,如果它適合你。 (如果你不知道我的意思,請訪問http://stackoverflow.com/faq) –