「R言語徹底解説」(Hadley Wickham 著・石田 基広・市川 太祐・高柳 慎一・福島 真太朗訳)を読んだ。

Hadley Wickhamの名著「Advanced R」の邦訳「R言語徹底解説」を頂きました。ありがとうございます!!!

多くの人がコメントされているように、この本はRのバイブルです。ここまで体系立って、簡潔かつ詳しくRについて書かれた本はありません。「徹底解説」の名にふさわしい徹底っぷりです。初心者から上級者まで、Rを使う人ならば一度は目を通すことをおすすめします。

また、原著のすばらしさもさることながら、翻訳もすばらしく、細かいところまで丁寧に訳されています。Hadleyは難解な概念を持ち出してきていたずらに読者を混乱させたがる癖がありますが、そういう部分にはちゃんと訳注が入っています。訳者のみなさまの奮闘にはただただ頭が下がるばかりです。

Advanced Rと私

書評からちょっと脱線して個人的な話をします。

原著「Advanced R」はインターネット上に無料公開されていて、誰でも読めるようになっています。実は私は、これを2年前に読んでいます*1

そのころ私は、Rを触り始めてから半年くらいの時期でした。もともとプログラミング自体経験がほとんどなかったこともあって、ネット上に転がるコードを意味も分からないままコピペする日々でした。コピペされたつぎはぎの知識しか持ちあわせていない、ただのR初心者でした。

そんなとき、Advanced Rに出会いました。初心者なので読み進めるスピードはだいぶゆっくりでしたが、「これなんでこうなるの?」と思いながらコピペしていたコードの意味が「あ、こういう仕組みか!」とだんだんわかるようになっていきました。そうして数か月間、毎日始業前にこの本を読んで苦戦しつつ勉強したことが、今のR力の基礎になっています。(もちろん、書いてあることをすべて理解するなんてまだまだ遠い話ですけど…)

上に「初心者から上級者まで」と書きましたが、個人的にはそういう経験があるので、「Rってよくわからないなあ」と思っている初心者の人にこそ読んでほしいと思っています。脱線終わり。

書評

第I部 基本編

第I部では、Rのデータ型/構造やその操作方法、関数、環境などについて書かれています。コーディングガイドやデバッグなど、実際にコーディングするにあたって役立つ実践的な事柄についても触れられています。

Rの型システムはやや複雑です。データの型(typeof()で見れる)以外に、S3というオブジェクト指向システムが使うクラス(class()で見れる)や他の属性が設定されていることがあり、そうした属性によっても挙動が異なったりします。このふるまいをRはどのようにして実現しているのか、その利点と短所について書かれています。*2

関数と環境は、Rそのものです。関数とは何か、という内容から、変数のスコープとRがオブジェクトを探しに行く仕組み、さらには、iffor$とか{までもが関数であるというショッキングな事実についてもここで語られます。

第I部は、基本編というだけあって、これからも基本に立ち返るために読み返すべき内容がまとまっています。今後も繰り返しこのあたりのページを開くことになるでしょう(実際私はそうでした)。

第II部 関数型プログラミング

第II部では、Rの関数型プログラミング言語としての側面について書かれています。

クロージャ汎関数高階関数、といった関数型特有の概念が登場しまくります。第II部は、関数型プログラミングになじみがない人にとっては難しい内容かもしれません。しかし、この章を一通り読めば、より効率的なRのコードが描けるようになるでしょう。(具体的には例えば、forループの代わりにlapply()を使いこなせるようになったりします)。*3

第III部 言語オブジェクトに対する計算

第III部は、非標準評価(NSE)にまつわる事柄が語られます。ここを読めば、library(ggplot2)library("ggplot2")で同じ結果になる仕組みがわかります。極めれば、RでHTMLやLaTeXをうまく生成する方法が分かります。

この部分の内容はやや高度です。が、他の言語を経験して、「dplyr::select(iris, Species)って、Speciesは文字列じゃないの? なんで"Species"みたいにしなくていいの??」とか思っちゃう人は読んどいて損はないです。あと、自分でこういうdplyrみたいなパッケージをつくりたい!と思った人もぜひ読みましょう。

(人がつくったパッケージしか使わない、という人はさらっと目を通すくらいでいいかもしれません)

第IV部 パフォーマンス

第IV部は、パフォーマンスについて書かれています。「Rは遅い」というのが本当なのか、速くするにはどうすればいいのか、さらにはC++(Rcpp)とCの書き方もカバーしています。

ここは、パフォーマンスに悩んでいる人は読むべきでしょう。メモリの使い方とかベクトル化するテクニックとかプロファイルの取り方とか、とても役立つ内容です。パフォーマンスに特に悩んでいない人は...、以下のHadleyの警句に従って、読まなくていいのかもしれません。

時間は貴重であり,データの解析に費やされるべきであって,コードの非効率な点を取り除くことに費やすべきではない.割り切る必要があるのだ.計算時間を数秒削減するために何時間も費やしてはならない. このアドバイスを守るには,コードに割く目標時間を設定し,その目標に向けて最適化するだけに留めなければならない.

耳が痛い。

とはいえ、ここで語られているトピックは興味深いので一読の価値はあります。分かり切ったR本体のバグがなぜ修正されないのかというつらみとかつらみとか…

Rcppについては最小限だけという感じなので、がっつり学びたい!という人は@teuderさんのIntroduction to Rcppがオススメです。

C APIについては、あまり語られることがないので貴重です。これ以外だとHadleyのドキュメントか、いつか出ると噂のR言語の構造に期待しましょう。

感想

この本のすごいところは、内容がまったく古びないところです。

上に書いたように、私がこの本をはじめて読んだのは2年前でした。まだdplyrも一般的ではなかったような時代です。それから2年。様々なパッケージが登場し、%>%演算子がRのコーディングスタイルをがらっと変えました。目まぐるしく流行が移り変わるR界では、普通の本は翻訳している間にもう時代遅れになってしまうことも少なくありません(例えば、みんなのRの書評にこぞって「すごくいい本だけど、dplyrを使っていないのだけが惜しい」と書かれていたのは記憶に新しいでしょう)。それなのに、この本の内容は相変わらず新鮮です。これは、冒頭でHadleyが、

Rはかなり癖のある言語なので時にイライラさせられるが,それでもRが本質的にはエレガントで美しい言語であり,データ分析や統計処理を実行するのに適した工夫に満ちていることを、本書を通じて示したい。

と書いていることの証左でもあります。まさに、Rには流行に左右されない本質があり、この本はその本質について記されたものです。

ぜひ手元にこの本を一冊持って、快適なRライフを送りましょう。

*1:原著が出版されたのは2014年9月なので、私が読んだ頃のはまだまだ未完成のバージョンでしたけど

*2:オブジェクト指向の話題でひとつ補足しておくと、最近はやりのR6パッケージについては触れられていません。興味があれば、@nakamichiさんのスライドを見てみるといいかもしれません。

*3:ちなみにこの本にはpurrrパッケージは登場しません。いまHadleyが執筆中のR for Data Scienceにはpurrrを使ったナウい説明があるので、興味があればそちらも読んでみるといいと思います。