來自 STL 的向量

用 Rcpp 最佳化 R 程式碼

Romain François

Consulting Datactive, ThinkR

Rcpp 向量 vs 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 程式碼

擷取正值:替代演算法

  • 先用 🔃 計算最終大小
NumericVector x ; 
int n = x.size() ;
int np = 0 ;
for( int i=0 ; i<n ; i++ ){ 
    if( ___ ){
        np++ ;
    }
}
用 Rcpp 最佳化 R 程式碼

擷取正值:替代演算法

  • 建立正確大小的向量
NumericVector result(np) ;
  • 再用 🔃 填入向量
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...