2017-02-19 8 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

로그 누적이나 다른 변환을 위해 여전히 람다를 사용할 수 있습니다. 그러나 후속 조치에 대한 감사합니다! –