読者です 読者をやめる 読者になる 読者になる

300億円欲しい

メジャーリーグのデータ解析します

Rのforeach関数を使って並列計算をしたい (その1)

foreach関数とは

Rでfor文を回すことはご法度らしいです. 計算が遅いので.
Rの高速化のために様々な手段が考えられます.
その1つが並列計算です.

Rのforeach関数は, Rで並列計算をする際にしばしば登場します.
この関数で何ができるのかよく分かりません.

なので, 今回は並列計算の前に, foreach関数の確認をします.

使い方

for文のような関数らしいです.

基本的な使い方...

foreach(i = 範囲, .combine = 結果の出力形式) %do% {関数}

イテレータの範囲と出力, 関数を指定します.

詳しくはドキュメントを参照します.
http://cran.r-project.org/web/packages/foreach/foreach.pdf
よく分かりません.

# foreach.r 2013-08-17
# foreach package test

# install.packages("foreach")
library(foreach)

# 1から4までの平方根を並べたベクトルを作ります.
# 範囲は1:4, 出力形式について .combine = c とするとベクトルになります.
x <- foreach(i=1:4, .combine = c) %do% sqrt(i)
x
#[1] 1.000000 1.414214 1.732051 2.000000

なるほど.
出力形式を変えてみます.

# 結果の総和が欲しいので, .combine = '+' とします
pi <- foreach(i=1:100, .combine='+') %do% { 1/i /i }
sqrt(pi*6)
#[1] 3.132077
 
# 結果の積が欲しいので, .combine = '*' とします
fact <- foreach(i=1:10, .combine='*') %do% { i }
fact
#[1] 3628800

演算子でもって結合させました.
ベクトル同士の結合もできます.
rbind(行ベクトルとして結合) とcbind(列ベクトルとして結合)ができます.

x <- foreach(a=1:3, b=4:6, .combine=rbind) %do% {c(a,b)}
x
#             [,1] [,2]
#result.1    1    4
#result.2    2    5
#result.3    3    6
 
x <- foreach(a=1:4, b=4:6, .combine=cbind) %do% {c(a,b)}
x
#     result.1 result.2 result.3
#[1,]        1        2        3
#[2,]        4        5        6

なるほど.

計算速度の比較

foreach関数は何が嬉しいのでしょうか.
for文よりも速かったら泣いて喜びます.

実験しました.

# foreach関数を使います.
before = proc.time()
x <- foreach(i = 1:10000, .combine = c) %do%{
   sum(rnorm(100))
}
proc.time() - before
#   ユーザ   システム       経過  
#    3.691      0.008      3.699 
 
# for文を回します
before = proc.time()
for(i in 1:10000){
   sum(rnorm(100))
}
proc.time() - before
#   ユーザ   システム       経過  
#    0.184      0.002      0.186 

(。>﹏<)

つづきます.