Funções inline com cppFunction

Otimizando código R com Rcpp

Romain François

Consulting Datactive, ThinkR

Limites do evalCpp

evalCpp("40 + 2")
42
evalCpp("PI")
3.141593
evalCpp("exp(1)")
2.718282
Otimizando código R com Rcpp

cppFunction

Defina uma função C++ com cppFunction()

library(Rcpp)
cppFunction("int fun(){
   int x = 37 ;
   return x ;
}" )

Chame essa função a partir do R

fun()
37
Otimizando código R com Rcpp
cppFunction("int fun(){
   int x = 37 ;
   return x ;
}", verbose = TRUE )
Código gerado para a definição da função: 
 ------------------------------------------------------
#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
int fun(){
  int x = 37 ;
  return x ;
}

Funções extern "C" geradas 
 -----------------------------------------------------
#include <Rcpp.h>
// fun
int fun();
RcppExport SEXP sourceCpp_1_fun() {
BEGIN_RCPP
    Rcpp::RObject rcpp_result_gen;
    Rcpp::RNGScope rcpp_rngScope_gen;
    rcpp_result_gen = Rcpp::wrap(fun());
    return rcpp_result_gen;
END_RCPP
}
Otimizando código R com Rcpp
Funções R geradas 
 -----------------------------------------------

`.sourceCpp_1_DLLInfo` <- dyn.load('/private/var/folders/r_/1b2gjtsd7j92jbbpz4t7ps340000gn/T
/Rtmpl8dL6H/sourceCpp-x86_64-apple-darwin15.6.0-0.12.16/sourcecpp_4bb22c766031/sourceCpp_2.so')

fun <- Rcpp:::sourceCppFunction(function() {}, FALSE, `.sourceCpp_1_DLLInfo`, 'sourceCpp_1_fun')

rm(`.sourceCpp_1_DLLInfo`)

Compilando a biblioteca compartilhada
 ----------------------------------------------------

DIR: /private/var/folders/r_/1b2gjtsd7j92jbbpz4t7ps340000gn/T/Rtmpl8dL6H/sourceCpp-x86_64-
apple-darwin15.6.0-0.12.16/sourcecpp_4bb22c766031

/Library/Frameworks/R.framework/Resources/bin/R CMD SHLIB -o 'sourceCpp_2.so'  'file4bb247d077c.cpp'  
clang++  -I/Library/Frameworks
/R.framework/Resources/include -DNDEBUG   -I"/Library/Frameworks/R.framework/Versions/3.4/
Resources/library/Rcpp/include" -I"/private/var/folders/r_/1b2gjtsd7j92jbbpz4t7ps340000gn/
T/Rtmpl8dL6H/sourceCpp-x86_64-apple-darwin15.6.0-0.12.16" -I/usr/local/include   -fPIC  
-Wno-unused-result -Wno-c++11-inline
-namespace -O3 -c file4bb247d077c.cpp -o file4bb247d077c.o
clang++ -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module 
-multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib
-o sourceCpp_2.so file4bb247d077c.o -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework 
-Wl,CoreFoundation
Otimizando código R com Rcpp

cppFunction

Defina uma função C++ com cppFunction()

library(Rcpp)
cppFunction("int fun(){
   int x = 37 ;
   return x ;
}" )

Chame essa função a partir do R.

fun()
37
Otimizando código R com Rcpp

R é de tipagem dinâmica

x <- "hello"
x
typeof(x)
"hello"

"character"
x <- 42L
x
typeof(x)
42

"integer"

C++ é de tipagem estática.

// Defina x como double

double x = 42.0 ;

// Não é possível redefini-lo como int
// ----> isso não compilaria

int x = 14 ;
Otimizando código R com Rcpp

Declaração de tipos dos argumentos e do retorno

    tipos dos argumentos x e y: double
               |         |
               v         v
double add( double x, double y ){

    // corpo da função
    // ...

}
Otimizando código R com Rcpp

Declaração de tipos dos argumentos e do retorno

 tipo de retorno: double
   |
   v  
double add( double x, double y ){

    // corpo da função
    // ...
    // ...
}
Otimizando código R com Rcpp

Declaração de tipos dos argumentos e do retorno

 tipo de retorno: double
  |
  |  nome da função: add
  |   |
  |   |    tipos dos argumentos x e y: double
  |   |      |         |
  v   v      v         v
double add( double x, double y ){

    // corpo da função
    // ...
    // ...
}
Otimizando código R com Rcpp

Um exemplo de soma

Função C++ para somar dois double.

cppFunction( "
double add( double x, double y){ 
    double res = x + y ; 
    return res ;}
" )
add( 30, 12 ) 

Código R equivalente

addr <- function(x, y) {
    res <- x + y
    res}
Otimizando código R com Rcpp

Vamos praticar!

Otimizando código R com Rcpp

Preparing Video For Download...