ベクトル処理言語
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/06/03 23:39 UTC 版)
R言語は、「ベクトル処理」と呼ばれる実行機構により、柔軟な処理を簡便な記法で実現している。 R言語で言う「ベクトル」とは数学的用語のベクトルとはやや異なり「構造を持ったデータ集合」という「リスト」に近い意味を持つ。すなわち、実数や複素数からなる数学上のベクトルや行列はもちろん、配列・リスト・テーブル(データフレーム)・集合・時系列などといった複雑な構造を持ったデータも、特に宣言することなく変数に入れることができる。ベクトルの要素がさらにテーブルや時系列の配列などであるといった「入れ子構造」であってもよい。このおかげで複雑なデータ構造が他愛もなく構築・管理できる。 予約語としてRに組込まれた演算も、関数も、ベクトルを扱うことができる。ユーザー定義関数をベクトル対応にするための関数もある。こうしたRの演算子やRの関数は、ベクトルの全要素に順に作用したり調べるといった構造にできている。そのおかげで、プログラム全体の制御構造が単純化して意味が明瞭になる。リストをうまく使うことによって、通常他の言語で複数要素を処理する時の「目的とする計算の本質とかけ離れたアルゴリズム」(たとえば、カウンターを使ったループや条件分岐等)の作成負担から解放される。(他のプログラミング言語で似た記法を探すとすれば、たとえばLisp言語のmapcar関数、Perl言語のmap関数など。) 例として、円周率をモンテカルロ法で近似する計算を挙げる。 s <- 100000x <- runif(s)y <- runif(s)sum(x^2 + y^2 <= 1) * 4 / s ここで『 <- 』は代入(この場合『 = 』とも書けるが推奨はされていない)、『 runif(a) 』は一様乱数を a 個作りベクトルで返す関数、『 a^2 』は a の二乗、『 sum( a <= b) 』は引数のベクトル要素数を返す関数、を意味する。この場合sum関数の引数はTRUEまたはFALSEのリストからなる論理値型ベクトルである。ベクトルaおよびbの対応要素同士を比較演算子で比較した結果が並んでいるので、真であった個数が返る。 上の例で、sum関数によって、条件分け計算を複数回行なう指示が暗黙のうちになされていることに注目されたい。すなわち、0から1の値をとる一様乱数xとyの組からなる「サンプルを十万個作り、そのうち半径1の円内に入ったサンプルが何個かを数える。」という計算の本質を、forループのような繰返し処理の記述を必要とせず、簡潔に表現できている。 代入『 <- 』は「付値」と呼ばれる関数でもあり、以下のように一行に書き換えても意味は同じとなる。 sum(runif(s <- 100000)^2 + runif(s)^2 <= 1) * 4 / s 論理値型ベクトルは数値計算の関数や演算子に渡すと数値「TRUE=1」「FALSE=0」と解釈される。上記の計算では、それを利用して集約関数の sum で合計を出している。 ベクトルは「論理添字(元のベクトルと要素数が等しい論理値型ベクトルを用いた添字指定)」を使うことで要素の絞り込みができ、そのベクトルに対して付値を行うと、絞り込んだ要素だけを別内容に置き換えることが可能になる。論理添字も変数に付値すれば複数の取り回しはさらに簡素化する。 Rの添字では数値ベクトルによる「数値添字」も利用でき、変数に付値もでき要素抽出にも不自由なく使えるが、「論理添字」の場合は複数を揃えて論理計算できるため、数値添字だけでは難しい複雑な抽出処理が制御も分岐も使わず明快に出来る。 添字ベクトルxの利用は基本的に、1次元ベクトル・テーブルでは『変数 [x]』のように記述して指示する。行列などでは次元数に適宜準じ指定添字次元だけが間引き対象になり、時系列やレコードの部分抽出などに利用される。 以下は論理添字同士の論理計算を利用したFizzBuzz問題の解答例。(記号"#"から改行まではコメント文) このコードをコメント文に照らせば、処理の論理が無理なく実装されていることが見て取れる。ここでは「FizzSet」と「BuzzSet」が論理添字変数であり、これらによる、抽出・置換・論理積を利用している。 なお、付値記号の矢印は代入の向きを左右どちら向きにもできる。一般的には左向き矢印が推奨されているが、機能は変わらないので混乱のない限り可読性の向上に利用できる。以下では「計算 -> 新規変数」「抽出要素 <- 置換値」の意味づけで用いている。 # 1から100までの整数を、ベクトルで生成する。(n: 加工前の数列 ・ Ans: 加工後の結果用数列)1:100 -> n -> Ans# 3の倍数FizzSet相当のAns要素を、文字列"Fizz"に置き換える。(FizzSet: 3の倍数位置を示す論理ベクトル)Ans[n %% 3 == 0 -> FizzSet] <- "Fizz"# 5の倍数BuzzSet相当のAns要素を、文字列"Buzz"に置き換える。(BuzzSet: 5の倍数位置を示す論理ベクトル)Ans[n %% 5 == 0 -> BuzzSet] <- "Buzz"# 両倍数の共通集合相当のAns要素を、文字列"FizzBuzz"に置き換える。Ans[FizzSet & BuzzSet] <- "FizzBuzz"# 出力する。cat(Ans) ベクトルの各種演算に加えて、行列の各種演算が可能である。 イテレーターとしての for をはじめ各種制御命令も充実しているので、ベクトルや行列の簡潔な処理では書けない制御や大型の計算も記述できる。
※この「ベクトル処理言語」の解説は、「R言語」の解説の一部です。
「ベクトル処理言語」を含む「R言語」の記事については、「R言語」の概要を参照ください。
- ベクトル処理言語のページへのリンク