6

main関数内のパッケージ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

ただし、コンパイラはmainメソッド内での独自の関数の作成を受け入れないことを私は知っています。Rに渡さなくても、別のRcpp関数を作成して呼び出すにはどうすればよいですか?inline

4

1 に答える 1

15

bodyは関数の本体用です。次のincludes引数を確認し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 )

?cxxfunctionincludes引数に関する詳細なドキュメントがあります。

ただし、このバージョンでは、入力ベクトルに適切な変更が加えられることに注意してください。これは、おそらく望んでいるものではありません。のバージョンも利用する別の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
于 2012-12-19T16:09:16.317 に答える