Если вы предпочитаете идиомы C++, используйте std::vector<double>
и верните его в конце, где он будет преобразован с помощью неявного wrap()
в вектор R. Вы также можете использовать векторы Armadillo или Eigen через RcppArmadillo и RcppEigen.
Наши объекты представляют собой неглубокие оболочки вокруг объекта R, поэтому push_back
, скажем, на Rcp::NumericVector
всегда нужна полная копия. Это известно и задокументировано.
Редактировать: Итак, для полноты картины, вот пример использования RcppArmadillo:
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
// [[Rcpp::export]]
arma::vec shrink(arma::vec x) {
arma::vec y = x;
y.resize( y.size()-2 );
return y;
}
который мы можем развернуть через
R> Rcpp::sourceCpp('/tmp/vec.cpp')
R> shrink(1:10)
[,1]
[1,] 1
[2,] 2
[3,] 3
[4,] 4
[5,] 5
[6,] 6
[7,] 7
[8,] 8
R>
person
Dirk Eddelbuettel
schedule
08.12.2012
reserve
. Мы могли бы реализоватьresize
. - person Romain Francois   schedule 10.12.2012