Si usted está abierto a cambiar de C a C++, se obtiene la capa de RCPP añadido de forma gratuita. He aquí un ejemplo de la página del paquete RcppExample (todavía bastante 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
}
Como se ve, hay una asignación de memoria explícita, liberando, PROTECT/UNPROTECT
etc, y se obtiene un primer objeto de la lista de clase I espalda.
Hay muchos más ejemplos, incluido in other SO questions such as this one.
Editar: Y que en realidad no dice lo que usted caminos haría, sino como una simple ilustración, aquí está el código C++ utilizando las adiciones RCPP cumsum()
y rpois()
que se comportan igual que lo hacen en I:
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
Y como prueba, de vuelta en R, si ponemos la semilla, podemos generar exactamente los mismos números:
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>
Es posible que desee comprobar los ejemplos de la "escritura R Extensiones" http Manual: //cran.r-project.or g/doc/manuals/R-exts.pdf (capítulo 5). O necesitas un vector C de dobles 'double *' o un vector R 'REALSXP'. –