4

RInsideを介してC++内でRを使用しようとしています。アルマジロ行列をRに渡して、結果を返すのに問題があります。以下では、Rライブラリ関数から結果を返すことができますが、間違った結果が得られます。Rで正常に機能する例として、momentsパッケージの歪度関数を使用しています。RInsideの例を確認しましたが、RcppArmadilloの使用方法がまだわかりません。C ++のアルマジロ行列をRに正しく渡すにはどうすればよいですか?

    #include <RInside.h>                   
    #include <RcppArmadillo.h>

    using namespace std;
    using namespace arma;

    int main(int argc, char *argv[]) {
        RInside R(argc, argv);  


        string R_libs = "suppressMessages(library(moments));";

        R.parseEvalQ(R_libs);

        mat A = randu<mat>(5,5);

        R["A"] = A;

        string R_skewness = "B <- skewness(A);";
        //this fails
        mat B = Rcpp::as<mat>(R.parseEval(R_skewness)); //terminate called after throwing an instance of 'Rcpp::not_a_matrix'   

        //this works but wrong
        mat B = Rcpp::as<vec>(R.parseEval(R_skewness)); // returns only 1 number, should be 5 ( 1 for each columnn), same result if i change mat B to vec B
        exit(0);
 }
4

2 に答える 2

5

実装した方法でas<mat>は、渡すRオブジェクトが行列である必要があります。そしてあなたの例Bではベクトルです:

> A <- matrix( runif(25), ncol = 5)
> A
           [,1]      [,2]       [,3]       [,4]      [,5]
[1,] 0.19215339 0.5857249 0.14345222 0.32154176 0.6162155
[2,] 0.95753898 0.9618379 0.06239842 0.06200197 0.7044018
[3,] 0.33575790 0.1372804 0.03027635 0.62662467 0.9778451
[4,] 0.16504957 0.1919765 0.49176372 0.94841456 0.2914772
[5,] 0.01570709 0.8055231 0.51218581 0.79562809 0.6939380
> B <- skewness( A )
> B
[1]  1.15196587 -0.04547576  0.32186257 -0.30788111 -0.29251009

私への変換についてarma::vecは、あなたが見ている振る舞いを再現しません。にarma::vecは3つの要素があります。

require( RcppArmadillo )    ## and make sure you have Rcpp 0.10.0 or later

sourceCpp( code = '
// [[Rcpp::depends("RcppArmadillo")]]

#include <RcppArmadillo.h>

using namespace arma ; 
using namespace Rcpp ;

// [[Rcpp::export]]
List foo( NumericVector x){
    vec B = Rcpp::as<vec>(x); 

    return List::create( 
        _["nrows"] = B.n_rows,
        _["ncols"] = B.n_cols
    ) ;

}
')
foo( c(1, 2, 3 ) )
# $nrows
# [1] 3
# 
# $ncols
# [1] 1
于 2012-11-14T16:03:46.050 に答える
4

いくつかの高度にテンプレート化されたライブラリを含む複合式を試しています。それはうまくいかない可能性があります。私はそれをバラバラにすることをお勧めします:

  1. A埋め込まれたRに渡されると予想されるマトリックスがあることを確認してください

  2. 関数呼び出しが正しく機能したことを確認し、結果を確認してください。

  3. 重要:結果の種類を確認してください。マトリックスは正常に戻るはずです。

  4. 結果をC++に戻します。

  5. Rcppに入手してください。

  6. RcppArmadilloマーシャリングを使用してArmadilloにアクセスします。

原則として、これは機能するはずです。いつものように、悪魔は細部に宿っています。

于 2012-11-14T15:53:18.063 に答える