繰返処理

繰り返し処理は 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の場合は、入力ベクトルを一つずつ足した結果をすべて出力する。
cumsum(1:10)
## [1]  1  3  6 10 15 21 28 36 45 55
sum(1:10)
## [1] 55
cumprod(1:n) 入力ベクトルの累積乗を計算。cumprod(1:n) = 1 * 2 * 3 * ... * n。
cumprod(1:5)
## [1]   1   2   6  24 120
prod(1:5)
## [1] 120
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