残りの私たちにとって、Rが最高のプログラミング言語である理由

私はRを使用して6年以上になります。Rとの最初の出会いは、財政学におけるモンテカルロシミュレーションの博士課程の時で、紹介してくれたのはWolfgang Hörmannでした。プログラミング言語に関しては、それ以前にもいくつか使ったことがあり、最後のものはC++(これも私は大好きです)でしたが、それらのどれもRほど便利ではありません。

残りの私たちにとってRが最高の言語である理由をリストアップする前に、まず “残りの私たち” の定義を明確にしておきましょう。残りの私たちとは、ExcelユーザやSPSSユーザ、そしてコンピュータサイエンス(CS)界の外にいる人々(*)、つまり簡潔さを目指して努力しながら、同時にパワーと柔軟性を追求する “プログラムの利用者” のことです。Rは、そんな私たちにとって、最高の言語と言えます。

なお、折に触れて、Rの最も近しい仲間であるPythonと比較をしていますが、Pythonユーザに他意があるわけではありませんので、あらかじめご了承ください。

※実のところ、私はCS界に一部、足を踏み入れています(本当に少しですが)。でも、だからと言って、それ自体に問題があるわけではないですよね。

1. すぐに使える

Rをダウンロードしてインストールしてみてください。すぐにプログラミングを始めることができます。もちろん、AtomやRStudioのようなエディタがあればなおよいでしょう。しかし、それらがなくても作業を始めることは可能です。

一方、Pythonを使って作業をする場合、まずぶつかるのが初期設定の煩雑さです。シェルのスクリプトから実行することも、IDLEを使うこともできますし、あるいは、Anacondaのようなbundlerを使用することも可能です。初心者にインストールさせて、Pythonでいくつかのコマンドを実行させてみれば、その煩雑さはすぐに明らかになるはずです。

また、Pythonには2つのバージョン、2.xと3.xがあります。今や(必然的に)3.xが主流だと言う人もいるでしょうが、それでも2.xに依存している部分はかなりあります。混乱はインストール前から始まっているのです。

2. シンプルな設計

R言語を最初に設計したのは、CS界の人々ではなく統計学界の人々です。残りの私たちにとって非常に便利なこの言語の約束事の中には、CS界の人々が不合理だと思うこともあります。簡単な例を挙げてみましょう。

文字A-B-C-D-Eを保持する “オブジェクト” があるとしてください。オブジェクトの各要素が文字を保持しています。それをmyobjectと名付けましょう。

Rではmyobject[1]は “A” を返します。一方Pythonでは、インデックスが0から始まるため “B” を返します。 “A” を返すのはmyobject[0]です。私がCS界の人々にオブジェクトのインデックスは1から始まると言うと、彼らは文字通り驚いて引いてしまうのです。では、ここまではいいとして、次の例を見てみましょう。

Rではmyobject[1:3]は “A” 、 “B” 、 “C” を返します。文字通り、インデックス1から3ですね。一方Pythonでは、エンドポイントが含まれていないため、返すのは “B” と “C” です。ABCをしっかりと取得するにはmyobject[0:3]としなければなりません。それでインデックス0–1–2、つまり “A” 、 “B” 、 “C” を取得することになるのです。全く何なのでしょうか。

Rではmyobject[-1]は最初の要素を除く全ての要素、 “B” 、 “C” 、 “D” 、 “E” を返しますが、Pythonでは最後の項目、 “E” を返します。myobject[1]は2番目の項目を返すのに、myobject[-1]で返すのは最後から1番目の項目です。本当にややこしいですよね。

私はここでインデント対ブラケット表記の議論まで話を広げるつもりはありませんが、私の意見ではブラケットは分かりやすく有用です。Pythonではインデントを使う必要がありますが、それは大して重要ではありません。

また、Rには “メソッド” (例えばobject.method())がなく、あるのは関数のみです。一応、Rのオブジェクトに関数を定義できますが(object$method())、そんなことは誰もしないし、する必要もないでしょう。

3. パッケージ

文字通りRで何千ものことをすることができます。手始めに、タスクビューをチェックしてみてください。これは単にタスクビューというだけに止まりません。CRAN(RのAppストア)には現在10000以上のパッケージが用意されています。

どんな作業でも、どんなコードでも、恐らくそのためのR用パッケージがあるはずです。様々なニーズに対応した、数多くの統計モデルやツールなどがあります。

文献の最新の進歩のほとんどはR用パッケージとして提示されています。パッケージとしてインストールして読み込めば簡単だからです。更に、パッケージをGitHubにアップロードすることもできます。

CRANは高品質のリポジトリなので、パッケージのアップロードが大変なことがあります。そのため多くのR開発者は、最初にパッケージをGitHubに入れてからCRANに送っています。

パッケージをインストールするには、install.packages(“packagename”)を1回記述して(パッケージとその依存関係をダウンロードします)、library(packagename)を記述すればいいだけです。それで作業を開始できます。

4. ドキュメンテーションとコミュニティ

Rのコミュニティは最大とは言えませんが、その内容は間違いなくトップクラスです。もしあなたがRで問題に遭遇した場合、StackExchangeや同様のプラットフォームをのぞけば、同じような問題を抱える人を見つけることができるでしょう。また、もし見つからなかったとしても、助けてくれる人はたくさんいるはずです。

加えてドキュメンテーションも素晴らしいです。ある関数の使い方が分からない場合、その関数の名前の前に?を付けてコンソールに入力すると(例:?functionname)、プロセスやパラメータ、使用結果についての情報が掲載されたヘルプファイルが開かれます。また、(ほとんどの事例に対する)サンプルセクションがあり、コードがどのように動くかをリアルタイムで確認でき、その結果を複製することも可能です。

5. データ構造

Rのデータ構造は把握が容易で、そのプロパティも覚えやすく、データ同士の関係も非常に良好です。確かに最初はベクトル計算が多少、複雑に思えるでしょうが、Rではベクトル的計算をスキップすることができます(ただし、スピードが犠牲になります)。

6. tidyverse(特にdplyrおよびggplot2)

tidyverseパッケージはRの醍醐味でしょう。これは実際にはメタパッケージで、havenやforcats、stringr、tidyr、readr、dplyr、そしてggplot2などのパッケージで構成されています。それぞれが優れた機能を有していますが、データ操作用のdplyr、それからプロット用のggplot2の2つが特に重要なパッケージです。どちらも非常にエレガントで驚くほど理解しやすく、エクステンションや機能追加で拡張可能な優れた有用性を備えています。

7. 不具合の報告機能

コードを完全な文書、レポート、更には書籍に変換する魔法の杖があるとしましょう。Rではその杖に、rmarkdown、knitr/sweave、bookdownといった名前が付けられています。これらのパッケージをpandocと一緒に利用することで、Rのコードを出力することが可能です(pdf、docx、htmlなどお望みの形式に)。

8. インタフェースツールとしてのR

この点に関して、Rはまだまだ未熟であることは否めません。しかしShinyという、少なくとも試作用の作業には有効なパッケージがあります。Shinyを使うことで、コードをインタラクティブなWebページに変換可能です。

9. 弱み

Rにも弱みはありますが、それはRを使う妨げにはなりません。

  • Rは大規模なデータプロジェクトには適していません。それはRがメモリ内で機能するからで、ハードディスクへの書き込みや読み込みなどの作業は苦手としています。しかし、この点はあまり問題にはならないでしょう。なぜなら、ほとんどの場合、提供されるメモリで十分だからです。もし足りない場合は、VPSをセットアップして十分なリソースを取得する方法が考えられます。
  • 基本のRは並列プログラミングをサポートしていません。それをサポートするパッケージは限られています。しかし、これも問題ないでしょう。並列プログラミングには特別な”スタイル”が必要となりますが、私がRを推奨する非CS界の人々は通常、そうしたスタイルに関心を持ってはいないからです。
  • Rには奇妙な構文があります。いや、この言い方は実際には語弊がありますね。CS界の人々にとっては奇妙かもしれません。彼らにインデックスは0ではなく1から始まると言うと、彼らはちょっと引きます。しかし最初の要素を1とする方が、一般的には理解されやすいのではないでしょうか。

10. 最後に

ぜひRを使ってみてください。こちらからどうぞ。