R言語
Rパッケージ数の飛躍的な増大に見られるとおり、統計学を超えて学問分野や業界を問わず、金融工学・時系列分析・機械学習・データマイニング・バイオインフォマティクスなど、柔軟なデータ解析や視覚化そして知識共有の需要に応え得るR言語の普及は世界的な広がりを見せている。
近年では、生命科学分野のためのRパッケージプロジェクトのBioconductorが立ち上がり、既に多くのゲノムスケール関連のパッケージが配布されている。ゲノムスケールデータの諸情報、すなわち、大規模遺伝子発現プロファイル・質量分析データ・蛋白質相互作用データなどを解析するプログラムやデータをRパッケージとしてRユーザーに配布する仕組みである。
また、アメリカ食品医薬品局 (FDA) への、嘗てSAS一辺倒だった、薬事申請や報告の際にも現在ではRが用いられている。
SPSSでは、2009年より製品名をPASW Statisticsと改め、R言語との連携強化を発表した。SPSSのインタフェースからR言語の機能を使える。
2009年7月にSAS Instituteは"R Interface Coming to SAS/IML Studio"によってSASからR言語へのインタフェースを提供することを発表した。SAS InstituteのWebサイトには、新たな統計手法は大抵の場合は真先にR言語上で実装されるという現状を踏まえて、SASユーザーの要望に応えてインタフェースの提供を行なう、との旨が述べられている。
RGLと呼ばれる3Dグラフ描画パッケージも提供されている。このパッケージを使用することでOpenGLにより実現される高速かつ美麗な3DCGを用いてデータのグラフ化が出来る。
関数型の引数を利用することもでき、その場合複数の関数が互いに呼び出しあうことができ、また無名の関数をその場で定義して関数型の引数として渡すことができる。一種の複文のような用途に用いられる。NA(not available) は統計処理においては欠くことのできない特殊なデータ「欠損値」(欠測値)(missing value)で、データが無効であることを示す。
R言語の関数はそれ自体がオブジェクトであり、ある関数自体を外から参照したり書き換えたりすることができる。関数の本体部分を返す body 関数・仮引数リストを返す formals 関数・関数に付随する環境を返す environment 関数などが用意されている。
渡された式そのものを操作することも可能で、特定の環境(名前とポインタのリスト)の下で与えられた式を評価する eval 関数・渡された式の要素を環境に応じて置き換える substitute 関数・式を文字列に分解する deparse 関数等がある。
関数呼び出しも一種のリストとして処理されており、次のように call 関数を用いて、関数名と引数のリストから関数呼び出しオブジェクトを生成できる。
関数はファイルから読み込むこともでき、さらには、パッケージとしてひとまとまりにすることもできる。
ここで『 <- 』は代入(この場合『 = 』とも書けるが推奨はされていない)、『 runif(a) 』は一様乱数を a 個作りベクトルで返す関数、『 a^2 』は a の二乗、『 sum( a <= b) 』は引数のベクトル要素数を返す関数、を意味する。この場合sum関数の引数はTRUEまたはFALSEのリストからなる論理値型ベクトルである。ベクトルaおよびbの対応要素同士を比較演算子で比較した結果が並んでいるので、真であった個数が返る。
上の例で、sum関数によって、条件分け計算を複数回行なう指示が暗黙のうちになされていることに注目されたい。すなわち、0から1の値をとる一様乱数xとyの組からなる「サンプルを十万個作り、そのうち半径1の円内に入ったサンプルが何個かを数える。」という計算の本質を、forループのような繰返し処理の記述を必要とせず、簡潔に表現できている。
代入『 <- 』は「付値」と呼ばれる関数でもあり、以下のように一行に書き換えても意味は同じとなる。
論理値型ベクトルは数値計算の関数や演算子に渡すと数値「TRUE=1」「FALSE=0」と解釈される。上記の計算では、それを利用して集約関数の sum で合計を出している。
ベクトルは「論理添字(元のベクトルと要素数が等しい論理値型ベクトルを用いた添字指定)」を使うことで要素の絞り込みができ、そのベクトルに対して付値を行うと、絞り込んだ要素だけを別内容に置き換えることが可能になる。論理添字も変数に付値すれば複数の取り回しはさらに簡素化する。
mean, sum, cumsum, cumprod, rowMeans, table、などの集約関数群
apply, lapply, by, などの汎関数群や、Reduce, Map, Filter、などの高水準関数群
sample関数による数値・複素数・文字列などの加重標本抽出(サンプリング)記述
オブジェクト指向(関数・代入式もオブジェクト)(「オブジェクト指向」を参照のこと)
単純な構文・データ型宣言不要・名前空間(「仕様」を参照のこと)
文字列・式の相互変換やパターンマッチング検索・編集などの文字列操作
対話的処理だけでなくバッチ処理も可能
解析手法の比較検証には欠かせない「定番の検証用データ集」
ニューラルネット、決定木、クラスター、主成分・因子分析・多変量解析、線形・非線形・自己相関モデルなど、多数の高水準組込関数群
画像処理・音声合成・GIS・テキストマイニングなどCRANによって日々強化される拡張機能
擬似乱数生成法としてメルセンヌ・ツイスタ(デフォルト設定)や他の多種の生成法が選択可能
すべてのプラットフォームにおいて64bit対応
R言語には継承やメソッドの実行時ディスパッチといったオブジェクト指向プログラミングの手法が取り入られており、数多くの総称的な (generic) 関数を持つ。これは同じ関数名であっても、取り扱うオブジェクトが属しているクラスによって独自の方法で処理を行うものである。Rでは、クラスはオブジェクトに付随する属性として扱われるものの一つであり、リストとして保持される。
数値型(複素数を含む)・文字型・論理型といった基本的な型やベクトル・リスト・行列といった統計処理や情報処理に必要な型を備えている。既述のように、関数それ自体もデータである。データフレームは配列ないしはリストの拡張版で、コラムごとに異なったデータ型を持てるため、表の形で表現されたデータを格納/操作するのに有用である。データフレームは行列から生成することもあるが、ここではリストとの関連で説明する。
Rの添字では数値ベクトルによる「数値添字」も利用でき、変数に付値もでき要素抽出にも不自由なく使えるが、「論理添字」の場合は複数を揃えて論理計算できるため、数値添字だけでは難しい複雑な抽出処理が制御も分岐も使わず明快に出来る。
添字ベクトルxの利用は基本的に、1次元ベクトル・テーブルでは『変数 [x]』のように記述して指示する。行列などでは次元数に適宜準じ指定添字次元だけが間引き対象になり、時系列やレコードの部分抽出などに利用される。
以下は論理添字同士の論理計算を利用したFizzBuzz問題の解答例(記号"#"から改行まではコメント文)。
このコードをコメント文に照らして見れば、先の例と同様「ループもカウンターも条件分岐もないのに同等の処理ができる」ことを利用して、題意に沿った論理が無理なく実装できているとわかる。ここでは「FizzSet」と「BuzzSet」が論理添字変数であり、これらによる、抽出・置換・論理積を利用している。
なお、付値記号の矢印は代入の向きを左右どちら向きにもできる。一般的には左向き矢印が推奨されているが、機能は変わらないので混乱のない限り可読性の向上に利用できる。以下では「計算 -> 新規変数」「抽出要素 <- 置換値」の意味づけで用いている。
ベクトルの各種演算に加えて、行列の各種演算が可能である。
イテレーターとしての for をはじめ各種制御命令も充実しているので、ベクトルや行列の簡潔な処理では書けない制御や大型の計算も記述できる。