りんごがでている

何か役に立つことを書きます

『R言語徹底解説』(共立出版)をいただきました!

先日、出版社の方から新刊の『R言語徹底解説』(共立出版)をいただきました。ありがとうございます。

R言語徹底解説 / Hadley Wickham 著 石田 基広 市川 太祐 高柳 慎一 福島 真太朗 訳 | 共立出版

f:id:bicycle1885:20160211220632j:plain

この本は、R言語界では知らない人のいないHadley Wickham氏の書いた『Advanced R』の翻訳です。翻訳はこれまた日本のR言語界では知らない人のいないであろう石田先生・市川氏・高柳氏・福島氏の4名の手により行われています。本のページ数は500ページ以上もあり、R言語の仕様・プログラミングスタイル・高速化について書かれています。おそらく、Rの言語自体について書かれた日本語の本としては最も詳細な本でしょう。

プログラミング言語マニアとして見ると、R言語プログラミング言語としては非常に特異な言語だと思います。例えばスカラーにあたる型がなく、すべてベクトルとして扱ったり、引数の遅延評価など、他のメジャーな言語から来た人にとってはとても奇妙な振る舞いをします。また、GNU R (R言語の標準的な処理系) は決して高速とは言えず、実用されるプログラミング言語の中では最も遅い言語の部類でしょう。R言語はどういう動きをするのか、どうしてこうした特徴を持つのかについて答えてくれるのが、この『R言語徹底解説』です。

第6章「関数」では、R言語の関数について詳細に説明しています。6.3節の「すべての操作は関数呼び出しである」では、実はR言語でのオブジェクトに対する操作すべてが関数呼び出しであることを説明しています。ここでは、ifによる分岐やforによる反復などを含む本当にすべての操作が、関数呼び出しにより行われることを強調しています。普通のプログラミング言語では、if文の条件部分の評価のみが先に行われて、その値に応じて2つの別々に処理へと分岐します。関数呼び出しでif文を実現しようと思っても、関数に与えた引数が先に評価されるため、普通は実現できません。しかし、Rでは引数の遅延評価を行うことで、次のように実現可能になるわけです。

> i = 1
> `if`(i == 1, print("yes!"), print("no."))
[1] "yes!"

(6.3節から一部抜粋)

また、未定義の変数を関数に渡すこともできます。

> exists("x")
[1] FALSE
> f <- function(x) {}
> f(x)
NULL

このような機能があるおかげで、例えばggplot2ではggplot(diamonds, aes(x=carat, y=price)) + geom_point()のように簡潔に式が書けるわけです。他にも、この章で説明されている仮引数に対する値の束縛・クロージャ・コピー修正セマンティクスなども、奇妙なRという言語を扱う上で重要な知識でしょう。

第16章では、R言語のパフォーマンスの問題について議論されています。よく知られているようにGNU RによるR言語の実装は速くはありません。これは、R言語がデータ処理のやりやすさに特化した動的な言語であるためです。また、GNU Rの開発は、安定性のためにパフォーマンスを改善する変更に対してはかなり保守的なようです。これは開発において何を優先するかの問題で、決して間違った考えではないと思います。それに、多くの場合についてはR言語のコードを改善するだけでもそれなりにパフォーマンスは良くなります。そのため、第16章から18章のR言語でのパフォーマンスチューニングの手法を学べば十分でしょう。どうしても必要な場合にのみC言語C++を使うことになりますが、これらの言語をR言語から使う方法についても以降の章で説明されています。

個人的な使い方の話をすると、私はパフォーマンスが必要な部分はJulia言語を推しているのですが、R言語の安定感を求める人にはJulia言語はまだ時期尚早かもしれません。私の使い方としては、R言語でデータの基本的な処理 (バイオインフォなのでBioconductorなどのパッケージをよく使う) を行って簡単なテキストファイルを作り、それをもとにJulia言語で計算をして、R言語で可視化するというR > Julia > Rの順で使うことが多いです。なるべくJulia言語でできるところを増やしたいのですが、それでもR言語から離れられるほど成熟していません。

R言語徹底解説』はR言語の基礎を確認してストレスなく使うために役立つ本だと思います。R言語の仕様をあまり意識してこなかった人にとっては、全部は読まなくとも前半部分の第9章くらいまで目を通しておくだけでも随分違うと思います。