Llamar a una función R usando inline y Rcpp sigue siendo tan lento como el código R original

Necesito evaluar una función (distribución posterior) que requiera bucles largos. Claramente, no quiero hacer esto dentro de R en sí, por lo que estoy usando "inline" y "Rcpp" para implementar C ++. Sin embargo, estoy descubriendo que en el caso en que cada bucle usa una función R, la función cxx se ejecuta tan lentamente como ejecutar el código R (consulte el código y la salida a continuación). En particular, necesito usar una función de distribución acumulativa normal multivariable dentro de cada bucle, y así estoy usando pmvnorm () del paquete mvtnorm.

¿Cómo puedo usar esta función R dentro de la función cxx y acelerar las cosas? Me gustaría entender por qué sucede esto para poder usar otras funciones R en la función cxx en el futuro.

Gracias.

test <- cxxfunction(
  signature(Num="integer",MU="numeric",Sigma="numeric"),
  body='
  RNGScope scope;

  Environment stats("package:mvtnorm");
  Function pmvnorm = stats["pmvnorm"];

  int num = Rcpp::as<int>(Num);
  NumericVector Ret(1);
  NumericMatrix sigma(Sigma);
  NumericVector mu(MU);
  NumericVector zeros(2);

for(int i = 0; i < num; i++)
{
  Ret = pmvnorm(Named("upper",zeros),Named("mean",MU),Named("sigma",sigma));
}
return Ret;
',plugin="Rcpp"
)

system.time(
test(10000,c(1,2),diag(2))
)
    user  system elapsed 
    5.64    0.00    5.75 

system.time(
for(i in 1:10000){
pmvnorm(upper=c(0,0),mean=c(1,2),sigma=diag(2))
}
)
   user  system elapsed 
   5.46    0.00    5.57 

Respuestas a la pregunta(1)

Su respuesta a la pregunta