r-statistics-fanの日記

統計好きの現場の臨床医の覚書のようなもの

Rcppを試す

Rcppを試す

https://rs-fan-jp.shinyapps.io/surv_jp/
H22 survival data in Japan

前に自作したWebアプリで、すでに人生の折り
返し時点を過ぎてしまっていることに気がついた。
親の平均余命もなんか具体的すぎてグッと来る。

時間は無限ではないので、ここらで更に新しい
言語に挑戦するのも良いんじゃないかと思った。

まずはお手軽に、Rccpから挑戦してみる。

http://www.slideshare.net/masakitsuda940/rcpp-36654397

Rcppのすすめ

ここを参考にする。

http://rpubs.com/kaz_yos/pi-calcRPubs - pi calculation

このpi計算をやってみる

library(Rcpp)
library(rbenchmark)

cppFunction('double pi3Cpp(){
      long circle_in = 0;
      Rcpp::NumericVector x = runif(200000000);
      for (long i = 0; i < 100000000; ++i) {
            double  l = x[i]*x[i] + x[i+100000000]*x[i+100000000];
            if (l < 1.0){
                  circle_in++;   
            }
      }
      return(4.0 * circle_in / 100000000);
}')

f0 <- function(){
      n = 100000000
      x <- runif(n = n)
      y <- runif(n = n)
      print(4*sum(x^2 + y^2 <= 1)/n)
}

rbenchmark(f0(),pi3Cpp())

> benchmark(f0(),pi3Cpp(),replications = 1)
[1] 3.141575
[1] 3.1417
      test replications elapsed relative user.self sys.self user.child sys.child
1     f0()            1    9.43    3.532      8.98     0.43         NA        NA
2 pi3Cpp()            1    2.67    1.000      2.46     0.17         NA        NA
> 

9.4秒が2.6秒になった。わーい。

ただ使ってみて良くわかったのは、コンパイルエラーは難しい。
こんな単純なことでもエラーで苦労した。
慣れているとはいえ、なんとRは簡単な事か。

本当はC++の一様乱数を使用したかったが、エラーで使えなかった。

#include <random>してもstd::mt19937がエラーで読めない。

結局Rのrunif()を使っている。この呼び出し時間がかかるっぽい。
毎回呼び出すと8.15秒で、ベクトル化したRと変わらん感じだった。

なんだか素のc++を勉強したくなった。