Se siete aperti a passaggio da C a C++, si ottiene strato di Rcpp aggiunto gratuitamente. Ecco un esempio dalla pagina del pacchetto RcppExample (ancora piuttosto incomple):
#include <RcppClassic.h>
#include <cmath>
RcppExport SEXP newRcppVectorExample(SEXP vector) {
BEGIN_RCPP
Rcpp::NumericVector orig(vector); // keep a copy
Rcpp::NumericVector vec(orig.size()); // create vector same size
// we could query size via
// int n = vec.size();
// and loop over the vector, but using the STL is so much nicer
// so we use a STL transform() algorithm on each element
std::transform(orig.begin(), orig.end(), vec.begin(), ::sqrt);
return Rcpp::List::create(Rcpp::Named("result") = vec,
Rcpp::Named("original") = orig) ;
END_RCPP
}
Come si vede, non allocazione di memoria esplicita, liberando, PROTECT/UNPROTECT
ecc, e si ottiene un elenco di oggetti di prima classe R indietro.
Ci sono molti altri esempi, incluso in other SO questions such as this one.
Edit: E non ha davvero dire quello che i percorsi avrebbe fatto, ma come una semplice illustrazione, ecco codice C++ utilizzando le aggiunte Rcpp cumsum()
e rpois()
che si comportano proprio come fanno in R:
R> library(inline)
R>
R> fun <- cxxfunction(signature(ns="integer", lambdas="numeric"),
+ plugin="Rcpp",
+ body='
+ int n = Rcpp::as<int>(ns);
+ double lambda = Rcpp::as<double>(lambdas);
+
+ Rcpp::RNGScope tmp; // make sure RNG behaves
+
+ Rcpp::NumericVector vec = cumsum(rpois(n, lambda));
+
+ return vec;
+ ')
R> set.seed(42)
R> fun(3, 0.3)
[1] 1 2 2
R> fun(4, 0.4)
[1] 1 1 1 2
E come prova, di nuovo in R, se poniamo il seme, siamo in grado di generare esattamente gli stessi numeri:
R> set.seed(42)
R> cumsum(rpois(3, 0.3))
[1] 1 2 2
R> cumsum(rpois(4, 0.4))
[1] 1 1 1 2
R>
si consiglia di verificare gli esempi in "scrittura R estensioni" http manuale: //cran.r-project.or g/doc/manuali/R-exts.pdf (capitolo 5). O hai bisogno di un vettore C di doppi 'double *' o di un vettore R 'REALSXP'. –