2017-02-19 86 views
1

根据犰狳网站,你可以在lambda函数传递到.each_col,如使用带lambda函数的RcppArmadillo each_col?

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

以下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才能获得lambda支持。神奇的线是[[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()所做减少的lambda用例。

> 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)''''''''''''''''' – JCWong

+0

每列执行cumsum。您仍可以使用lambda作为日志或其他转换的cumsum。但感谢后续! –