2017-02-19 10 views
1

アルマジロのウェブサイトによると、あなたは、このようなラムダ関数でRcppArmadillo each_colを使用していますか?

X.each_col([](vec& a){ a.print(); });

として、.each_colにラムダ関数に渡すことができ、次のRcppががエラーを持っているようだ、「期待式」

#include <RcppArmadillo.h> 
// [[Rcpp::depends(RcppArmadillo)]] 

using namespace Rcpp; 
using namespace arma; 

// [[Rcpp::export]] 
arma::vec colCumSum(const arma::mat& X) { 
    return X.each_col([](const arma::vec& b){ b.cumsum(); }); 
} 

答えて

4
を報告

実際には、ラムダをサポートするためにRにC++ 11を使用するよう伝えなければなりません。魔法のラインは[[Rcpp::plugins("cpp11")]]で、それはすべての作業を行います:

しかし、一度私はcumsum()に問題を取得します。あなたはまた、あまりにも多くのconstをそこに持っていた。

と別のlambdaで動作します - これは印刷されたばかりの簡単なバージョンです。私はまた、一貫性のためにivecimatになっ:

#include <RcppArmadillo.h> 
// [[Rcpp::depends(RcppArmadillo)]] 

// [[Rcpp::plugins("cpp11")]] 

// [[Rcpp::export]] 
arma::ivec colCumSum(arma::imat& X) { 
    X.each_col([](arma::ivec& a){ a.print(); }); 
    return X.col(0); 
} 

/*** R 
M <- matrix(1:16, 4, 4) 
colCumSum(M) 
*/ 

これを調達する場合、それはビルドと実行されます。 cumsum()が行う縮小については、ラムダユースケースを解決する必要があります。

> sourceCpp("/tmp/foo.cpp") 

> M <- matrix(1:16, 4, 4) 

> colCumSum(M) 
     1 
     2 
     3 
     4 
     5 
     6 
     7 
     8 
     9 
     10 
     11 
     12 
     13 
     14 
     15 
     16 
    [,1] 
[1,] 1 
[2,] 2 
[3,] 3 
[4,] 4 
> 
+1

ありがとうございました!それはcumsumを呼び出す正しい方法が '' 'cumsum(b)' 'です。また、Armadilloは既に '' 'cumsum(X、0)' 'を使ってカラムごとにcumsumを実行する方法を持っていました。 – JCWong

+0

ログのcumsumやその他の変換にはラムダを使用できます。しかし、フォローアップのおかげで! –

関連する問題