R言語
統計解析用の言語。S言語の皮を被ったLisp。
ローカルで、統計やデータマイニングをするときには非常に重宝する。
S言語ファミリーとUNIX(2009/8)
友人に、SAS使いの統計家がいるのだけれど、そいつがS言語を学びたいというので、しばらく前に、彼とR言語について話をした。で、彼が言うには、どうも、彼にとってはS言語は(そしてR言語も)非常に難しいってこと。
R言語も、S言語も、比較的シンプルな言語で、ま、難しい使い方をすれば、難しいこともできるけれど、簡単な仕事は、簡単にできる言語。
彼は、僕をはじめとするR使いたちを見ていて、
「いったい何をしたいのかわからないことがある。」
という。
R使いの流儀では、まとまったプログラムをはじめに作らないで、ごちゃごちゃと、短いプログラムを作っているうちに、統計的な結論が出てくる。
あれは、いったい何を作っているのだ?
と彼は聞く。
僕には、彼が、Sの何が分からないのか、よく分からなかった。で、いつも、口数が多い僕にしては珍しく、相手の言っていることをじっと聞いていたのだが、聞いているうちに、なるほどと理解したことがあった。
たぶん、これは、GUIは分かるけれどもUNIXのコマンドラインが難しいっていう初心者rootと同じ原因で起きている症状だと思う(あるいは、PerlやPythonを使ったシステム管理が苦手な人たち。)。というのは、S言語について、彼が使いにくいって言っている部分は、S言語のUNIX的な部分のことなんだ。
もちろん、勉強がすすめば、他にも、いろんな壁があるかもしれないけれども、とりあえず、どうも最初の壁は、UNIX的な考え方になじみにくいってところみたいだ。UNIX的な考え方のツールってのは、それなりの利便性があるから、ああいう形になっているのだけれど、UNIX的な考え方になじみのない人にとっては、ユーザーフレンドリとは言いがたい。
でも、みたところ、SとかRの参考書で、その背景にあるUNIXの思想に触れているものはあんまりない。
で、以下は、S言語とR言語のどんなところが、UNIX文化の影響を受けているかの話。
歴史の話だけれど、確認しながら書いているわけじゃないし、現在のSやRから、僕が想像して書いている部分もある。だから、この文章を読んだ人で、間違いに気がついた人がいたら、教えてほしい。
R言語ってのは、S言語のファミリーのひとつだ。
もともと、S言語ってのがあって、で、それのGNUによる拡張がR言語。
で、その、元になったS言語ってなんだってことになると、これは、統計解析に特化した機能をもった言語ってのが、答えになる。
というわけで、ここでは、まず、S言語の話をする。
S言語は、UNIXやC言語を生み出したベル研究所で、それらよりも若干遅れて1980年代初めに開発された。当時のSの開発目的は、探索的データ解析を支援することであったらしい。
探索的データ解析ってのは、統計の研究スタイルのひとつ。1960年代から、Tukeyって人が、提唱していたやりかた。いろんな点で、古典的なスタイルと異なるのだけれど、そのひとつの特徴がモデルを作る前に、データをいろんな視点から見ることが大事だって考え方。
つまり、結論を急がず、とりあえず、元のデータをいろんなグラフにしたり、表にしたり、いろんな見方でじっくり見ようってこと。いわば、データを使って実験するみたいなもの。
そのためには、
いろんなデータ処理をインタラクティブにすばやくできなくてはいけない。
必要に応じて、既存のデータ処理方法を組み合わせて、手軽に新しい処理方法を作れなくてはいけない。
そうしなくては、データを、思いつくままにいろんな見方で見ることはできない。
当時、大規模なデータ処理ってのは、たいてい、IBMの大型機で行われるものだった。そして、大型機はどのような計算をしたいかあらかじめ計画を立てて、バッチ処理で動かすものだった。だから、探索的データ解析みたいに、いろんなデータを使った実験を手軽に行うのは困難だった。
SASっていう統計言語は、当時のIBMの大型機の文化を引きずっている。この言語は、fortranや昔のBASICに似た言語。で、必要な処理は、すべて、バッチプログラムにして解析を行う。これでは、探索的データ解析は難しい。
探索的データ解析には、シェルを使ってインタラクティブに操作できる端末と、データを蓄積したサーバーのネットワークが必要だったんだ。
S言語は、そういうニーズから生まれた環境のひとつ。ベル研の連中は、UNIXワークステーションが開発されたとき、このマシンを使えば、つまり、UNIX端末からデータを扱うためのシェル環境があれば、探索的データ解析が簡単に可能になることに気がついた。この統計用シェル環境のアイデアは、1984年、Sシステムとして発表されることになる。
Sシステムのシェルコマンドの構文には、C言語の構文を真似たものが採用された。おそらく、C言語は、当時のベル研のUNIXエンジニアにとって、もっともなじみやすい言語であったからだと思う。
また、Sシステムのシェルからは、コマンドを入力すればインタラクティブにデータを操作できたし、コマンドを並べることでスクリプトを作ることもできた。
つまり、この新しいSシステムは、スクリプト言語としても利用可能なコマンドインタプリタであるという点で、UNIXシェルに似ていたが、制御構文などの文法はC言語に似た、いかにもUNIXとC言語の文化を引き継いだものだった。
また、Sシステムは、統計データの取り扱いの機能以外はほとんどなく、統計処理のために必要ないと考えられたオペレーティングシステムの機能へのアクセスは、ほとんどできなかった。Sシステムは、初期のUNIXツールらしく、問題の80%を解くためのシンプルな機能のみ実装するという方針で作られていたため、統計処理に必要性が少ないと考えられた機能は、実装されなかったのだろうと思う。
もし、そういったSシステムが実装していない機能が必要なユーザーがいたらどうすればよかったのだろうか?この場合のSシステムの解決策も、いかにも、UNIXツールらしい方法が用意されていた。つまり、必要な機能を持った他のUNIXツールと組み合わせて利用するのである。その目的のため、Sシステムの出入力は、他のUNIXツールに理解できるよう、シンプルで、短いものが多い。同時に不慣れな人間にとっては不親切である。
やがて、Sシステムは様々な拡張の結果、コマンドインタプリタから、完全なプログラム言語へと進化した。1988年には、プログラム言語仕様としてのS言語の仕様がまとめられた。
現在、よく使われるSの実装には、2種類。オリジナルのS言語を簡単に扱えるようにした、サポート付きの商業ベース環境のS-PLUSと、GNUによるSの拡張言語、R言語である。
R言語は、ほとんどの点でS言語互換であるが、GNUらしく、Lisp風の文化の影響を受けている。つまり、R言語は、見た目は、C言語風だが、実際は、LispとかSchemeのような、関数型言語なのだ。scheme風の言語に、S言語風のステートメントを追加したと言ってもいいかもしれない。
さらに、Sに比べ、大幅に機能が追加されている。なので、本来のUNIX風の禁欲的な匂いよりも、emacsとかと同じような雰囲気、つまり、頭頚関係なら、なんでも一つの環境でやってしまおうってノリを感じる。つまり、統計関係のキッチンシンク。
さて、というわけで、彼にはLife with UNIX―UNIXを愛するすべての人に
とUNIXという考え方―その設計思想と哲学
を薦めた。これらの本で出てくるUNIX的な考え方ってのは、現在でも、コンピュータで仕事をする人たちには重要で、役に立つ。効率的に仕事ができるようになること請け合い。