20 juillet 2018
Il est possible d'utiliser des fonctions codées en R
#include <RcppArmadillo.h>
// [[Rcpp::depends(Matrix,RcppArmadillo)]]
using namespace Rcpp;
// [[Rcpp::export]]
double runifCpp()
{
Function runif("runif");
return as<double>(runif(1));
}
library(microbenchmark) library(ggplot2) tm <- microbenchmark(runif(1),runifCpp(),times=1000L)
autoplot(tm)
## Coordinate system already present. Adding new coordinate system, which will replace the existing one.
L'utilisation de fonction codées en R comme runif, rnorm ou autre vont être plus longues à tourner si elles sont implémentées en C++. Il s'agit de fonctions déjà implémentées en C qui sont sont déjà rapides en R.
#include <RcppArmadillo.h>
// [[Rcpp::depends(Matrix,RcppArmadillo)]]
using namespace Rcpp;
using namespace arma;
// [[Rcpp::export]]
double runifCpp2()
{
return randu();
}
tm <- microbenchmark(runif(1),runifCpp(),runifCpp2(),times=1000L)
autoplot(tm)
## Coordinate system already present. Adding new coordinate system, which will replace the existing one.
L'importation de fonction R est donc à utiliser avec parcimonie et doit se limiter qu'à certains cas :
optim de R dans une fonction optimisation C++randn à utiliser)optimisation#include "RcppArmadillo.h"
// [[Rcpp::depends(RcppArmadillo)]]
using namespace arma;
using namespace Rcpp;
double norme2(vec x) {
return as_scalar(sqrt(sum(pow(x,2))));
}
// [[Rcpp::export]]
double frCpp(vec theta) {
vec X = (randn(1000)+1)/2;
const double pi = 3.141592653589793238462643383280;
int n = X.n_elem;
double m = theta[0];
double sigma2 = theta[1];
return -( -(n/2)*log(sigma2*2*pi) - pow(norme2(X-m),2)/(2*sigma2) );
}
#include "RcppArmadillo.h"
// [[Rcpp::depends(RcppArmadillo)]]
using namespace arma;
using namespace Rcpp;
// [[Rcpp::export]]
vec optimisation(vec thetaInit, Function fn){
Function optim("optim");
List resOpt = as<List>(optim(thetaInit,fn));
return resOpt["par"];
}
optimisation(c(0,1),frCpp)
## [,1] ## [1,] 0.5703562 ## [2,] 0.3068187
tm <- microbenchmark(optimisation(c(0,1),frCpp),optim(c(0,1),fr),times=1000L)
autoplot(tm)
## Coordinate system already present. Adding new coordinate system, which will replace the existing one.
Dans un package R utiliser la fonction de devtools
devtools::use_rcpp()
Le lancement de cette fonction :
src.gitignore (si le gestionnaire de version git est utilisé)srcLe code C++ doit se situer dans le dossier src. (Fichier > Nouveau > Fichier C++)
Les parties chronophages du package doivent être implémentées dans un fichier dans lequel les fonctions utiles sont exportées par [[Rcpp::export]].
La documentation de fonction Rcpp est aussi gérée par Roxygen
optimisationdevtools::use_rcpp()optimisation du package dans R