2012-11-11 5 views
6

私はちょうどRを学習し始めました。 Rで値がどのように出力されているか把握しようとしています.C++では単純にreturn変数を使用しますが、Rではそうではありません。4つの入力引数を取り、私はこのmyfunをRにロードして、C++関数からの出力を得たい場合、何をする必要がありますか?以下は私が使用しようとしているテンプレートです。ここC++とRのインタフェース、出力の取得

extern "C" { 
    SEXP myfun(SEXP S, SEXP A, SEXP B, SEXP C) { //will call this function from R. 
    SEXP rate, dir, list, list_names; //declare variables 

    PROTECT(rate = allocMatrix(REALSXP, 10, 2)); //allocate 10x2 matrix of double type? 
    PROTECT(dir = allocVector(INTSXP, 10)); //allocated vector(10) of int type? 

    double* p_rate = REAL(rate); //why do I need pointers? 
    int* p_dir = INTEGER(dir); 

//私はvector<vector<double> > someValvector<int> someVal2を算出し、C++の関数を呼び出します。

今、これらの値をレートとディレクトリに渡したいとします。

for(int i =0; i < 10; i++){ 
     rate[i][0] = someVal1[i][0]; 
     rate[i][1] = someVal1[i][1]; 
     dir[i] = someVal2[i]; 
    } 

しかし、コンパイラはそれを好まない。この場合、p_rateとp_dirポインタの使い方がわかりません。

また、次のコードがその方法である理由もわかりません。それは、文字列、レートとdirをlist_namesに渡しているようで、レートとdirに値があります。なぜ単純に裁定を行い、希望の値を印刷できないのですか?

char *tag[2] = {"rate","dir"}; 
    PROTECT(list_names = allocVector(STRSXP ,2)); 
    SET_STRING_ELT(list_names, 0, mkChar(tag[0])); 
    SET_STRING_ELT(list_names, 1, mkChar(tag[1])); 
    PROTECT(list = allocVector(VECSXP ,2)); 
    SET_VECTOR_ELT(list, 0, rate); 
    SET_VECTOR_ELT(list, 1, dir); 
    setAttrib(list, R_NamesSymbol , list_names); 

    UNPROTECT(8); 
    return (list); 
} 

Rの変数を返すという基本的な考え方が得られません。非常に混乱しているようです。私は、誰かが私にこれらのものを説明する適切なリソースを指すことができれば本当に感謝します。

ご協力いただきありがとうございます。

答えて

9

すでにC++に精通している場合は、シームレスなRおよびC++インテグリオン用のRcppプロジェクトがあります。それは多くのドキュメントと例のを含んでいます、そして、CRANはそれを使って、もう1つの大きなコーパスの例を提供する80以上のパッケージを持っています。

JSS paperに対応する「はじめに」ビネットから始まり、ここで[rcpp]タグを閲覧することもできます。

それ以外の場合は、R APIに戻っています。これは、もっと裸で、Cのみに基づいています。

5

previous questionに応答している間に、Rcppにショットを付けて、コード内のすべてのノイズを取り除きます。

#include <Rcpp.h> 
using namespace Rcpp ; 

void yourCode(std::vector< std::vector<double> >& someVal, 
       std::vector<double>& someVal2){ ... } 

extern "C" SEXP myfun() { 
    NumericMatrix rate(10, 2); 
    NumericVector dir(10) ; 

    std::vector< std::vector<double> > someVal ; 
    std::vector<double> someVal2 ; 

    // call whatever function that fills someVal and someVal2 
    yourCode(someVal, someVal2) ; 

    // fills rate and dir 
    for(int i =0; i < 10; i++){ 
     rate(i, 0) = someVal1[i][0]; 
     rate(i, 1) = someVal1[i][1]; 
     dir[i] = someVal2[i]; 
    } 

    // structure the output 
    List result = List::create( 
     _["rate"] = rate, 
     _["dir"] = dir 
    ) ; 

    return result ; 

} 
関連する問題