@hadley:残念ながら、C ++を使い始めるのに役立つ具体的なリソースはありません。私はスコット・マイヤーズの本(効果的なC ++、より効果的なC ++など...)からそれをピックアップしましたが、これらは実際に紹介と呼ぶことができるものではありません。
ほとんどの場合、.Callインターフェイスを使用してC ++コードを呼び出します。ルールはとても簡単です:
- 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を使用するためのR APIについて知っておくべきことはこれ以上ありません。
ほとんどの人は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に依存するパッケージで人々が何をしているのかを調べ、ビネットとユニットテストをチェックして、メーリングリストに戻ってください。いつでもお手伝いさせていただきます。