関数で計算した結果をベクトル要素にする     Last modified: Oct 07, 2008

以下に定義する 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 文を使うと遅いというのは,都市伝説だ。


・ 直前のページへ戻る  ・ E-mail to Shigenobu AOKI

Made with Macintosh