Rcpp

930 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
930
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
7
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Rcpp

  1. 1. Rcpp Romain François romain@r-enthusiasts.com @romain_francois jeudi 27 juin 13
  2. 2. R / C++ Romain François romain@r-enthusiasts.com @romain_francois jeudi 27 juin 13
  3. 3. n <- length(x) m <- 0.0 for( i in 1:n ){ m <- m + x[i]^2 / n } jeudi 27 juin 13
  4. 4. m <- mean( x^2 ) n <- length(x) m <- 0.0 for( i in 1:n ){ m <- m + x[i]^2 / n } Vectorization jeudi 27 juin 13
  5. 5. Writing efficient R code requires you to know a lot of tools jeudi 27 juin 13
  6. 6. #include <Rcpp.h> using namespace Rcpp ; double square(x){ return x*x ; } // [[Rcpp::export]] double fun( NumericVector x){ int n = x.size() ; double res = 0.0 ; for( int i=0; i<n; i++){ res += square(x[i]) / n ; } return res ; } jeudi 27 juin 13
  7. 7. 10 000 100 000 1 000 000 Dumb R 1008 10 214 104 000 Vectorized R 24 125 1 021 C++ 13 80 709 Execution times (micro seconds) jeudi 27 juin 13
  8. 8. m <- mean( x^2 ) Why vectorization is not enough ? jeudi 27 juin 13
  9. 9. Get StartedGet Started jeudi 27 juin 13
  10. 10. My First Rcpp function cppFunction("double add( double x, double y){ return x + y ; }") add( 1.0, 2.0 ) cppFunction for embedding directly small functions jeudi 27 juin 13
  11. 11. Going further #include <Rcpp.h> using namespace Rcpp ; // [[Rcpp::export]] double add( double x, double y){ return x + y ; } add.cpp (C++ code) sourceCpp( "add.cpp" ) add( 1.0, 2.0 ) R code jeudi 27 juin 13
  12. 12. Manipulate R data structures jeudi 27 juin 13
  13. 13. Most commonly used R Rcpp numeric vector NumericVector integer vector IntegerVector list List environment Environment function Function jeudi 27 juin 13
  14. 14. Vectors // create a NumericVector of length 10 NumericVector x(10); // access elements x[0] = 2.0 ; x[1] = x[0] ; // example double sum = 0.0 ; int n = x.size() ; for( int i=0; i<n; i++){ sum += x[i] ; } jeudi 27 juin 13
  15. 15. Lists // create a List with names List obj = List::create( _["a"] = 1.0, _["b"] = "foo" ) ; double a = obj["a"] ; std::string b = obj["b"] ; jeudi 27 juin 13
  16. 16. C++ data structures Modules jeudi 27 juin 13
  17. 17. The usual bank account example class Account { private: double balance ; public: Account( ) : balance(0){} double get_balance(){ return balance ; } void withdraw(double x){ balance -= x ; } void deposit(double x ){ balance += x ; } } ; RCPP_MODULE(BankAccount){ class_<Account>( "Account" ) .constructor() .property( "balance", Account::get_balance ) .method( "deposit", Account::deposit) .method( "withdraw", Account::withdraw) ; } account <- new( Account ) account$deposit( 1000 ) account$balance account$withdraw( 200 ) account$balance account$balance <- 200 jeudi 27 juin 13
  18. 18. Learn More - Rcpp book - Vignettes - Tutorial at useR - Mailing List - Custom Training jeudi 27 juin 13
  19. 19. Romain François romain@r-enthusiasts.com @romain_francois Questions jeudi 27 juin 13

×