在Rcpp中调用向量的子集(不替换元素)

时间:2018-07-02 14:34:32

标签: r subset rcpp

我想制作一个返回向量子集的函数。在R中,是

x <- 1:3 
x[2:3] # return 2nd, 3rd elements

我的Rcpp代码如下,

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

// [[Rcpp::export]]
Rcpp::List subset(arma::vec x){
  return List::create(Named("sub_x") = x.elem(seq(1,2)));
}

但是它给我一个错误

no matching function for call to 'arma::Col<double>::elem(Rcpp::Range)'

我见过很多帖子都在谈论使用.elem替换向量中的元素,但是据我所知,很难找到适合我的问题的东西。

1 个答案:

答案 0 :(得分:2)

一些评论:

  1. 您提供了一个向量。你想要一个向量。您编写了一个返回List的函数。嗯。

  2. 编译器告诉您它确实知道如何将Rcpp::Range插入Armadillo类型。这是一个很好的提示。

  3. Armadillo已将此文档记录在under element accesssubmatrix view中。

所以只要写

// [[Rcpp::export]]
arma::vec mysubset(arma::colvec x) {
  return x.rows(1,2);
}

您已完成此处的操作:

R> Rcpp::sourceCpp("~/tmp/so51138571.cpp")

R> x <- 1:3

R> mysubset(x)
     [,1]
[1,]    2
[2,]    3
R> 

这很可能也是现有索引问题的副本。