犰狳中的RCPP Sugar命令

时间:2018-07-27 06:42:45

标签: r rcpp armadillo

我正在尝试将Rcpp sugar的ifelse()命令与arma::vec一起使用。代码失败,错误

'ifelse' was not declared in this scope

我找不到解决方案。下面是一个简单的示例代码(导致错误)。

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

// [[Rcpp::export]]
arma::vec f(arma::vec x, arma::vec y) {
  arma::vec res1 = Rcpp::ifelse(x < y, x, y);
  arma::vec res = trans(res1)*y;
  return res;
}

/*** R
f(c(1,2,3),c(3,2,1))
*/

2 个答案:

答案 0 :(得分:2)

使用Armadillo的advanced constructors,可以使Rcpp::NumericVectorarma::vec指向相同的存储位置。然后,可以通过使用该内存的正确前端对象来使用Rcpp函数和arma函数:

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

// [[Rcpp::export]]
arma::vec f(Rcpp::NumericVector xr, Rcpp::NumericVector yr) {
  arma::vec x(xr.begin(), xr.size(), false, true); 
  arma::vec y(yr.begin(), yr.size(), false, true);
  Rcpp::NumericVector res1r(xr.size());
  arma::vec res1(res1r.begin(), res1r.size(), false, true);  
  res1r = Rcpp::ifelse(xr < yr, xr, yr);
  arma::vec res = trans(res1)*y;
  return res;
}

/*** R
f(c(1,2,3),c(3,2,1))
*/

我不是100%地确定这没有任何不良副作用。

答案 1 :(得分:1)

这是我发现的解决方案,希望对您有用。

#include <RcppArmadillo.h>

// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]

arma::vec f(arma::vec x, arma::vec y) {
  int n = x.size();
  arma::vec res(n); 
    for(int i = 0; i < n; i++){
      if (x[i] < y[i]){res[i] = x[i];} else{res[i] = y[i];}
  }
  return trans(res)*y;
}

输出为

/*** R
f(c(1,2,3),c(3,2,1))
*/
     [,1]
[1,]    8