Вызовите подмножество вектора в Rcpp (без замены элементов) - PullRequest
0 голосов
/ 02 июля 2018

Я хотел бы создать функцию, которая возвращает подмножество вектора. В 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 голосов
/ 02 июля 2018

Пара комментариев:

  1. Вы предоставляете вектор. Вы хотите вектор. Вы написали функцию, возвращающую List. Hm.

  2. Компилятор говорит, что знает, как вставить Rcpp::Range в тип Armadillo. Это хороший намек.

  3. Армадилло имеет это документально подтвержденное под доступом к элементу и представление подматрицы .

Так что просто напишите

// [[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> 

Вероятно, это также дубликат существующего вопроса индексации.

...