Rcpp: Renvoyer le tableau C en tant que NumericMasortingx to

#include  #include  extern "C" { #include "cheader.h" } using namespace Rcpp; // [[Rcpp::export]] NumericVector cppfunction(NumericVector inputR){ double const* input = inputR.begin(); size_t N = inputR.size(); double output[10*N]; cfunction(input, N, output); std::vector outputR(output, output + sizeof(output) / sizeof(double)); return wrap(outputR); } 

Cela fonctionne sauf que je dois convertir manuellement le vecteur outputR en masortingce de R. Je pourrais bien sûr aussi faire outputR en NumericMasortingx (ou puis-je?), Puis renvoyer cela, mais ma vraie question est de savoir si la procédure ci-dessus est optimale? Dois-je d’abord convertir la sortie en std :: vector puis en NumericVector / Masortingx ou puis-je éviter cela? J’ai essayé d’encapsuler la sortie directement mais cela n’a pas fonctionné

Placez ceci dans un fichier, cppfunction.cpp , et exécutez-le via la library(Rcpp); sourceCpp("cppfunction.cpp") library(Rcpp); sourceCpp("cppfunction.cpp") . Puisque cfunction n’a pas été fourni, nous en fournissons un qui ajoute 1 à chaque élément d’entrée:

 #include  using namespace Rcpp; void cfunction(double* x, int n, double* y) { for(int i = 0; i < n; i++) y[i] = x[i] + 1; } // [[Rcpp::export]] NumericVector cppfunction(NumericVector x){ NumericVector y(x.size()); cfunction(REAL(x), x.size(), REAL(y)); return y; } /*** R x <- c(1, 2, 3, 4) cppfunction(x) ## [1] 2 3 4 5 */ 

Si vous voulez renvoyer un NumericMasortingx supposez que la longueur de x a une racine carrée entière:

 #include  using namespace Rcpp; void cfunction(double* x, int n, double* y) { for(int i = 0; i < n; i++) y[i] = x[i] + 1; } // [[Rcpp::export]] NumericMatrix cppfunctionM(NumericVector x){ int n = sqrt(x.size()); NumericMatrix y(n, n); cfunction(REAL(x), x.size(), REAL(y)); return y; } /*** R x <- c(1, 2, 3, 4) cppfunctionM(x) ## [,1] [,2] ## [1,] 2 4 ## [2,] 3 5 */