#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 */