for を捨てよ、foreach を書こう
TRANSCRIPT
for を捨てよ、foreachを書こう
@hoxo_m
2015/07/18
自己紹介
• hoxo_m
• 某 ECサイトでデータ分析をやっています
• 作成パッケージ:
– pforeach (R の並列処理を超簡単に書く)
– SparkRext (SparkRを dplyrに近づける)
– dplyrr (dplyrの DB用ユーティリティー)
– lambdaR (R にラムダ式を導入する)
– easyRFM (RFM 分析を簡単に実行する)
R 入門者
R をおぼえたぞ!楽しい!
繰り返し処理が便利!
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/30.html
http://www.slideshare.net/imuyaoti/1507011-hiroshimar
R 上級者の教え
R で for を使ってはいけません
apply を使うのです
調べてみます
apply ファミリー
• apply
• sapply
• lapply
• mapply
• tapply
• eapply
• rapply
わからない
わからない
apply ファミリー
• なぜこんなにたくさんの関数の使い方を覚えなければならないのか?
– apply
– sapply
– lapply
– mapply
– tapply
– eapply
– rapply
foreach
foreachパッケージ
• Revolution Analytics 社が開発
• for と同じような使い方でわかりやすい
• apply ファミリのように使い分ける必要なし
• 返り値を返す
• イテレータを使った省メモリループ
• 並列化をサポート
for と同じような使い方
for
foreach
in ではなく =
%do% が必要
返り値を返す
for
foreach
結果を格納する変数の事前準備が不要
オプションによる柔軟な動作
• 特に .combine 引数は結果を結合する関数を指定できる
デフォルトではリストで返すが、結合関数に c を指定することでベクトルに
その他 .init や .final など「foreachについてまとめたい」が詳しい
Simultaneous Iteration
• 2 つの変数を同時に変更しながらループ
結果は 5, 7, 9 になる(1+4, 2+5, 3+6)
リスト内包表記
• リスト内包表記のように使える
Python の次のコードと同じ
iterators
イテレータ
• iteratorsパッケージ
必要になったときに必要な分だけ生成
⇒省メモリ
イテレータ
• foreachと組み合わせて使う
イテレータと省メモリ
イテレータで使う時だけ生成!
データが大きすぎてエラーに!
1億×10 の乱数行列に対してループしたい
※ iread.table() で大きなファイルを一行づつ読み込むこともできる
イテレータと並列化
• 並列化したとき、各クラスタノードに必要な分だけデータを渡す
• 不要な通信コスト削減
データを全部渡す
並列化
並列化
• バックエンドを設定すれば並列化可能
• 様々なバックエンドが使える
– parallel
– snow
– multicore
– Rmpi
• 詳細はこの本が金字塔
parallel & doParallel
• parallel パッケージ
– R 標準の並列化パッケージ
–インストール不要
• doParallelパッケージ
– foreachで parallel パッケージを用いた並列化を簡単にするためのパッケージ
並列化の基本
並列化の注意点
• 並列化するためにやること
–並列計算用ライブラリの読み込み
–クラスタの作成
–ループ内で使用するパッケージの指定
–ループ内にエクスポートする必要のある変数の指定
– %do% を%dopar% に変更
–クラスタの終了処理
pforeach
• めんどくさいと思ったあなたへ
• R で超簡単に並列処理を書けるパッケージpforeachを作った
http://d.hatena.ne.jp/hoxo_m/20141222/p1
まとめ
• for はバッドノウハウのかたまり
• apply ファミリーは初心者殺し
foreachを使おう!
参考• foreachパッケージの Vignette
– Using The foreach Package
–【超訳】foreachパッケージの使い方
• 書籍
–福島真太朗『Rによるハイパフォーマンスコンピューティング』
• スライド
– Rで並列処理:foreachパッケージ解剖学
– RにおけるHPC~並列計算編~