2012-12-19 17 views
6

inlineパッケージをmain関数内で使用してRcpp関数を作成する方法があるかどうかを知りたいと思います。これは私が何をしたいの例です。私は、コンパイラはmainメソッド内で独自の機能の作成を受け入れないことを知っているしかしRcpp + inline - 追加機能の作成と呼び出し

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

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

につながるはずです。どうすればinlineで別のRcpp関数を作成し、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引数に関する詳細なドキュメントがあります。

しかし、このバージョンでは、入力ベクトルに場所の変更が加えられますが、これはおそらくあなたが望むものではありません。またsapplyRcppバージョンを利用して別のバージョン:

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をご覧ください) –

関連する問題