Ответ 1
Если вы предпочитаете идиомы С++, используйте std::vector<double>
и верните это в конце, где он будет преобразован через неявный wrap()
в вектор R. Вы также можете использовать векторы Armadillo или Eigen через RcppArmadillo и RcppEigen.
Наши объекты представляют собой мелкие обертки вокруг объекта R, поэтому push_back
on, скажем, 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>