STLのベクター

Rcpp で R コードを最適化する

Romain François

Consulting Datactive, ThinkR

RcppベクターとSTLベクターの比較

Rcppベクター

  • Rベクターの薄いラッパー
  • サイズ変更にコストがかかる:毎回データがコピーされる

STLベクター

  • Rベクターとは独立
  • 拡張・縮小が低コスト:償却コピー
Rcpp で R コードを最適化する

ベクターから正の値を抽出する

ベクター化されたRコード

extract_positives <- function(x){
    x[x>0]}

ループ内でベクターを拡張する非効率なコード

extract_positives_loop <- function(x){
    y <- numeric()
    for( value in x){
        if( value > 0 ){
            y <- c(x, y)}  }
    y
}
Rcpp で R コードを最適化する

正の値の抽出:代替アルゴリズム

  • 最終サイズをカウントするための1回目のループ 🔃
NumericVector x ; 
int n = x.size() ;
int np = 0 ;
for( int i=0 ; i<n ; i++ ){ 
    if( ___ ){
        np++ ;
    }
}
Rcpp で R コードを最適化する

正の値の抽出:代替アルゴリズム

  • 適切なサイズのベクターを作成
NumericVector result(np) ;
  • ベクターを埋めるための2回目のループ 🔃
for( int i=0, j=0 ; i<n ; i++ ){
    if( ___ ){
        result[j++] = x[i] ;
    }
}
Rcpp で R コードを最適化する

STLを使用したシンプルなアルゴリズム

// [[Rcpp::export]]
std::vector<double> positives_stl( NumericVector x ){
    std::vector<double> out ;
    out.reserve( x.size() / 2 ) ;

    for( ___ ; ___ ; ___ ){
        if( ___ ){
            out.push_back(___) ;
        }
    }

    return out ;  
}
Rcpp で R コードを最適化する

練習しましょう!

Rcpp で R コードを最適化する

Preparing Video For Download...