繰り返し処理は for
文あるいは while
文で行う。ただ、R の for
文と while
文の実行速度は非常に遅い。できるだけ、これらの繰り返し構文を避けるべき。ほとんどの繰り返し構文は、ベクトル演算あるいは既存の関数によって代替される。
例えば、階乗や累積和などを求める際に for
文の代わりに、以下のような既存関数を利用することで、より速く計算できる。
関数 | 機能 |
prod(1:n) |
与えられたベクトルの積を計算。1:n を与えることで階乗を計算できる。 |
factorial(n) |
階乗を計算。prod(1:n) = factorial(n) = gamma(n+1) |
lfactorial(n) |
factorial の log 版。lfactorial(n) = log(factorial(n)) |
cumsum(1:n) |
入力ベクトルの累積和を計算。cumsum(1:n) = 1 + 2 + 3 + ... + n。 は入力ベクトルの合計値をしか出力しないが、cumsum の場合は、入力ベクトルを一つずつ足した結果をすべて出力する。
|
cumprod(1:n) |
入力ベクトルの累積乗を計算。cumprod(1:n) = 1 * 2 * 3 * ... * n。
|
choose(n, k)
| n 個の集合から k 個の要素を選び出すときの組合せの場合の数を求める。 |
combn(n, k) |
n 個の集合から k 個の要素を選び出すときの、すべての組合せを求める。 |
for 文による繰返処理
for
文を利用した繰り返し処理は、予めに繰り返し回数を与える必要がある。次は、for
文を利用して、1 から 100 までの合計値を計算する例である。
s = 0
for (i in 1:100) {
s <- s + i
}
# ベクトル計算
s <- sum(1:100)
次に、1 から 100 までの整数のうち、2 の倍数でありかつ 3 の倍数でない整数を画面に出力する例である。
for (i in 1:100) {
if (i %% 2 == 0 && i %% 3 != 0) {
print (i)
}
}
# ベクトル計算
x <- 1:100
x[(x %% 2 == 0) & (i %% 3 != 0)]
while 文による繰返処理
while
文は、ある条件式が与えられると、その条件式が偽になるまで処理を繰り返し続ける構文である。for
文とはことなり、繰り返しの上限回数を設定しなくてもよい。
次は、1 から 100 までの合計値を while
文で求める例である。while
文に、次のように条件式を与えることで、for
文と同じような振る舞いをさせることができる。
s <- 0
i <- 100
while (i > 0) {
s <- s + i
i <- i - 1
}
次は 1、2、3、…、と順に足していき、その和が初めて 1000 を超えた時に、足し算処理を中止する例である。
s <- 0
i <- 1
while (s < 1000) {
s <- s + i
i <- i + 1
}
s
## [1] 1035
# ベクトル処理
x <- 1:100
s <- cumsum(x)
s[1000 < s][1]
## [1] 1035