abs(- 1)
[1] 1
Rは関数型プログラミング言語であり,基本的にほとんどの処理を関数を用いて行う。
関数というのは,なにかを入力すれば,それに応じた出力が得られるものである。入力する「なにか」のことを引数という。関数はfunction_name(引数1, 引数2, ・・・)
のような形で用いられる。
たとえば,abs()
という関数は,引数として与えられたベクトルの各要素の絶対値を返す。例として,スカラー (長さが1のベクトル)-1
を引数として与えてみよう。
また,mean()
という関数は,引数として与えられたベクトルの要素の平均値を返す。
関数の使い方の詳細は,ヘルプを読めばわかる。たとえば,mean()
関数の説明を読みたい場合には,?mean
と入力すれば良い。
mean()
関数の使い方として,以下のように記述されている。
引数x
は平均を計算したいベクトルであるが,それ以外にも引数があることがわかる。これらの引数にはtrim
とna.rm
という名前がついていて,デフォルトの値 (trime
は0
, na.rm
はFALSE
)が設定されている。デフォルトの値が設定されている場合には,引数は省略可能である。引数を指定したい場合には,引数名 = 値
の形で指定する。
mean()
関数は,デフォルトではベクトルにNA
(not available,欠損値)が含まれている場合にはNA
を返す。NA
を除外して平均を計算する場合は,na.rm = TRUE
を指定する。
関数は,必ずしも何かを計算するためだけに用いるわけではなく,画面に何かを表示させたり,ファイルからデータを読み込んだりといったことにも用いられる。たとえば,q()
と入力すればRを終了させることができるが,q()
も関数である。
Rの関数名は,パッケージ間で競合する場合がある。関数を使う際に,特定のパッケージに含まれる関数であることを明示的に指定するには,パッケージ名::関数名()
のように書く。R本体に組み込まれている関数は,base::関数名()
である。また,関数名が競合しない場合でも,パッケージ名::関数名()
のように書いておけば,実行するために必要なパッケージが明らかになるという利点もあるので,コードの解説などではこのように記述している場合も多い。ここでは,とくに誤解を生じさせると考えられる場合を除いて,パッケージ名は省略する。
自分で関数を定義することもできる。同じような計算や処理を何度も行うときには,一連の処理を関数として定義しておけば便利だ。
たとえば,順列・組合せを求めたいとしよう。Rには組合せを求める関数としてchoose(n, r)
という関数が用意されており,n
個のなかからr
個を選ぶ組合せが何通りあるかを返す。
たとえば,37個の数字のなかから7個を選ぶ組合せは,以下のように求めることができる。
ロト7宝くじというのは,37個の数字のなかから自分が好きな数字を7個選び,それが7つの当選番号とすべて一致すれば一等というクジだ。37個の数字のなかから7個を選ぶ組合せは,ここで計算したように1千万通り以上だから,ロト7で一等が当たる確率は,1千万分の1以下ということになる。
次に順列を求めてみよう。Rにはn
個の中からr
個を取り出す順列を求める関数は用意されていない。そこで,n
とr
を引数として与えれば,順列を返す関数を自作してみよう。自作の関数は,
の形で定義する。デフォルトの値を設定する場合には,引数名 = 値
の形で指定する。この場合,引数3は省略可能で,省略した場合にはデフォルトの値である0
が代入される。
n
個の中からr
個を取り出す順列\({}_nP_r\)は,
\[{}_nP_r = \frac{n!}{(n-r)!}\]
で計算できる。ただし,\(n!=n \times (n-1) \times (n-2) \times \cdots \times 1\)であり,これを\(n\)の階乗という。階乗は,factorial()
関数で求めることができる。
順列の計算を行う関数をpermut()
として定義しよう。
このコードを実行したら,environmentタブを見てみよう。permut
という関数が作成されて表示されているはずだ。
自作の関数permut()
の引数はn
とr
の2つであり,これらを使って\({}_nP_r\)を計算し,p
に代入する。次に,return(p)
で順列の計算結果を返す。
return()
は関数が返す値を指定するが,これを指定しなければ,関数は最後に行われた計算結果を返す。したがって,permut()
関数は以下のように書いても良い。
ここでは計算が1つしか行われていないので,その結果が返される。
作成した関数を用いて実際に順列を求めてみよう。