我不明白Rcpp中的这种行为

时间:2014-10-21 02:04:41

标签: c++ r rcpp

我想使用Rcpp访问整数向量中第二个唯一元素的值,但是我得到一个零向量,其长度等于整数向量中第二个项的值。我做错了什么?

require(Rcpp)
cppFunction("NumericVector test(IntegerVector labelling1) {
  IntegerVector lvls = unique(labelling1);
  return(lvls[1]);
}")

  test(1:5)
 #[1] 0 0

2 个答案:

答案 0 :(得分:2)

这里实际上有一个单独的问题:您正在尝试从NumericVector构建int,而Rcpp会执行以下操作:

  1. 您的函数
  2. 返回整数值2
  3. NumericVector构造为NumericVector(2);即长度为2的NumericVector
  4. 如果您真正想要的是表示该索引值的IntegerVector,则必须写:

    IntegerVector test(IntegerVector labelling1) {
      IntegerVector lvls = unique(labelling1);
      return IntegerVector::create(lvls[1]);
    }
    

    或者您也可以使用Rcpp属性(自动处理从intIntegerVector的转换):

    #include <Rcpp.h>
    using namespace Rcpp;
    
    // [[Rcpp::export]]
    int test(IntegerVector labelling1) {
      IntegerVector lvls = unique(labelling1);
      return lvls[1];
    }
    
    /*** R
    test(1:5)
    */
    

答案 1 :(得分:1)

子集糖需要IntegerVector作为索引(http://gallery.rcpp.org/articles/subsetting/)。如果您想模仿R unique函数,则需要进行一些其他更改:

cppFunction("IntegerVector  test(IntegerVector labelling1, int i) {
              // get sorted unique values
              IntegerVector lvls = sort_unique(labelling1);
              // get unique values in order of occurence 
              IntegerVector lvls1 = lvls[match(lvls, labelling1) - 1];
              return(lvls1[IntegerVector::create(i - 1)]);}")

test(c(5:1, 1L), 2)
#[1] 4