以下に定義する dice というのは,n 回サイコロを振って,出た目が 2 以下であった回数を返す関数。
これは,試行数 n,母比率 1/3 の二項分布に従う二項乱数を返すことをシミュレートしている。
dice <- function(n) { return(sum(sample(1:6, n, replace=TRUE) <=2)) }この関数を下請けにして,n = 10 のときの実験を 1000 回行うというシミュレーションを行う。
ひとつのやり方は,for 文を使う方法である。わかりやすい方法であるが,まえもって 1000 個の結果を保存する場所を確保するというのが面倒。もう一つは,1000 というところが 2 回出てくるので,これを 2000 回に変えるときは二箇所を変えないといけない。変え忘れや,変え間違いもあるかもしれない。
x <- numeric(1000) for (i in 1:1000) x[i] <- dice(10)sapply 関数を使うと結果の保存場所を前もって確保する必要がない。また,回数を変更するときも一箇所だけでよい。
y <- sapply(rep(10, 1000), dice)replicate 関数はもうすこし簡便に書ける。
z <- replicate(1000, dice(10))見かけはだいぶ違うが,実行時間には殆ど差はない。for 文を使うと遅いというのは,都市伝説だ。