[Rcpp-devel] Mimicing of X[ X[,col]==val, ] with RcppArmadillo

Søren Højsgaard sorenh at math.aau.dk
Thu May 31 15:07:16 CEST 2012


Dear List

I've tried to make an Rcpp version of X[ X[,col]==val, ] and came up with the following:

sqbr <- cxxfunction(signature(r_X='float', r_col='int', r_val='double'), body =
'
  using namespace arma;
  using namespace Rcpp;
  using namespace std;
  
  mat XX     = as<mat>(r_X);
  double val = as_scalar(as<fvec>(r_val));

  colvec col = XX.cols(as<uvec>(r_col)-1);
  vec valvec = val * ones<vec>(XX.n_rows,1);

  NumericVector valvec2 = wrap(valvec), col2 = wrap(col);
  LogicalVector rowbool = valvec2 == col2;

  uvec rowidx = find(as<uvec>(rowbool)>0);

  Rcout << col;  Rcout << valvec;
  Rcout << "rowbool" << endl << as<uvec>(rowbool); Rcout << "rowidx" << endl << rowidx;

  mat ans = XX.rows(rowidx);
  return(wrap(ans));
'
, plugin='RcppArmadillo')

X <- matrix(c(1,2,3,4,4,5,6,7,7),nr=3)
cc <- 2
vv <- 4
sqbr(X,cc,vv)

I would expect that there is a way of doing this without having to jump "into" armadillo "back" to Rcpp and "into" Armadillo again. I just can't spot an easier way. If a simpler solution exists I would be interested to know...

A related question. Suppose I want to do X[ X[,col1]==val & X[,col2]>val2, ]. Is there any elegant way of doing this. I am thinking whether the operators "==" and ">" can be passed on as arguments so that one can do something similar to 
> `>`(5,2)
[1] TRUE
> `==`(5,2)
[1] FALSE

Best regards
Søren


More information about the Rcpp-devel mailing list