@hadley:残念ながら、C++の使用を開始するのに役立つ特定のリソースを念頭に置いていません。私はScottMeyersの本(Effective C ++、More Effective C ++など)からそれを取り上げましたが、これらは実際には入門書とは言えません。
C ++コードを呼び出すために、ほぼ排他的に.Callインターフェイスを使用します。ルールは簡単です:
- C++関数はRオブジェクトを返す必要があります。すべてのRオブジェクトはSEXPです。
- C ++関数は、0から65のRオブジェクトを入力として受け取ります(ここでもSEXP)
- extern "C"またはRcppが定義するRcppExportエイリアスのいずれかを使用して、Cリンケージで宣言する必要があります(実際にはそうではありませんが、後で使用するために保存できます) 。
したがって、.Call関数はいくつかのヘッダーファイルで次のように宣言されます。
#include <Rcpp.h>
RcppExport SEXP foo( SEXP x1, SEXP x2 ) ;
.cppファイルにこのように実装されています:
SEXP foo( SEXP x1, SEXP x2 ){
...
}
Rcppを使用するためのRAPIについて知ることはあまりありません。
ほとんどの人は、Rcppで数値ベクトルのみを扱いたいと思っています。これは、NumericVectorクラスを使用して行います。数値ベクトルを作成するには、いくつかの方法があります。
Rから受け継いだ既存のオブジェクトから:
SEXP foo( SEXP x_) {
Rcpp::NumericVector x( x_ ) ;
...
}
:: create static関数を使用して、指定された値を使用します。
Rcpp::NumericVector x = Rcpp::NumericVector::create( 1.0, 2.0, 3.0 ) ;
Rcpp::NumericVector x = Rcpp::NumericVector::create(
_["a"] = 1.0,
_["b"] = 2.0,
_["c"] = 3
) ;
与えられたサイズの:
Rcpp::NumericVector x( 10 ) ; // filled with 0.0
Rcpp::NumericVector x( 10, 2.0 ) ; // filled with 2.0
次に、ベクトルができたら、そこから1つの要素を抽出するのが最も便利です。これは、0ベースのインデックスを使用してoperator []を使用して実行されるため、たとえば、数値ベクトルの値を合計すると、次のようになります。
SEXP sum( SEXP x_ ){
Rcpp::NumericVector x(x_) ;
double res = 0.0 ;
for( int i=0; i<x.size(), i++){
res += x[i] ;
}
return Rcpp::wrap( res ) ;
}
しかし、Rcpp砂糖を使用すると、これをはるかにうまく行うことができます。
using namespace Rcpp ;
SEXP sum( SEXP x_ ){
NumericVector x(x_) ;
double res = sum( x ) ;
return wrap( res ) ;
}
前に言ったように、それはすべてあなたが書きたいコードの種類に依存します。Rcppに依存するパッケージで人々が何をしているのかを調べ、ビネット、単体テストを確認し、メーリングリストで私たちに戻ってきてください。いつでも喜んでお手伝いさせていただきます。