Kursa hoş geldin

Rcpp ile R Kodunu Optimize Etme

Romain François

Consulting Datactive, ThinkR

R ve C++

R

  • Harika, esnek
  • Yavaş
  • Yorumlanan

C++

  • Derlenen
  • Daha zor
  • Hızlı
Rcpp ile R Kodunu Optimize Etme

Motivasyon

  • Kodunu hızlandırmak için Rcpp kullan
  • C++'ın hepsini bilmene gerek yok
  • Basit C++ fonksiyonları yazmaya odaklan
Rcpp ile R Kodunu Optimize Etme

Kurs yapısı

  • Giriş - temel C++ söz dizimi
  • C++ fonksiyonları ve akış kontrolü
  • Vektör sınıfları
  • Vaka çalışmaları
Rcpp ile R Kodunu Optimize Etme

Performansı ölç

max'in döngülü sürümü

slowmax <- function(x){
   res <- x[1]
   for ( i in 2:length(x) ){
       if( x[i] > res ) res <- x[i]}
   res  }

microbenchmark ile performans karşılaştırması

library(microbenchmark)

x <- rnorm(1e6)
microbenchmark( slowmax(x), max(x) )

 

Birim: milisaniye
       expr       min       lq      mean    median        uq       max neval
 slowmax(x) 31.649452 34.29454 36.344912 35.435299 37.188249 90.363038   100
     max(x)  1.563559  1.74036  1.939367  1.847045  2.014684  3.340052   100
Rcpp ile R Kodunu Optimize Etme
Rcpp ile R Kodunu Optimize Etme

evalCpp ile basit C++ ifadelerini değerlendirme

library(Rcpp)
evalCpp( "40 + 2" )
42
evalCpp( "exp(1.0)" )
2.718282
evalCpp( "sqrt(4.0)" )
2

Kullanarak

std::numeric_limits<int>::max()

en büyük temsil edilebilir 32 bit işaretli tamsayıyı (int) almak

evalCpp(
   "std::numeric_limits<int>::max()"
   )
2147483647 

( $\footnotesize \mathtt{2147483647 = 2^{31}-1}$)

Rcpp ile R Kodunu Optimize Etme

Temel sayı türleri

C++ zengin sayı türlerine sahiptir

  • Tamsayılar: int
  • Kayan noktalı sayılar: double
Rcpp ile R Kodunu Optimize Etme

R

# Sayı sabitleri double'dır
x <- 42
storage.mode(x)
"double"
# Tamsayılar L soneki ister
y <- 42L
storage.mode(y)

z <- as.integer(42) storage.mode(z)
"integer"
"integer"

C++

# .0 soneki double zorlar
y <- evalCpp( "42.0" )
storage.mode(y)
"double"
library(Rcpp)
# Sayı sabiti tamsayılar int'tir
x <- evalCpp( "42" )
storage.mode(x)
"integer"
Rcpp ile R Kodunu Optimize Etme

Dönüştürme (Casting)

(double) ile açık dönüşüm

# Açık dönüşüm
y <- evalCpp("(double)(40 + 2)")
storage.mode(y)
"double"

Tamsayı bölmesine dikkat et

# Tamsayı bölmesi
evalCpp( "13 / 4" )
3

 

# Açık dönüşüm ve bu yüzden 
# double bölme kullanımı
evalCpp( "(double)13 / 4" )
3.25

 

# R'de otomatik dönüştürme
13L / 4L
3.25
Rcpp ile R Kodunu Optimize Etme

Hadi pratik yapalım!

Rcpp ile R Kodunu Optimize Etme

Preparing Video For Download...