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...