utils:::combn は組み合わせを配列で返すが,場合によっては一つずつ返してくれる方がうれしいこともある。
そこで,以下に示す next.combn を書いてみた。
next_combn = function(n, r, a) {
t = r
while (t >= 1 && a[t] == n - r + t) {
t = t - 1
}
if (t == 0) {
return(FALSE)
}
a[t] = a[t] + 1
for (i in t:r) {
a[i] = a[t] + i - t
}
return(a)
}
使い方は,n, r を指定して a を 1,2, ..., n のベクトルに定義して
n = 5
r = 3
a = 1:n
以下のように引用する。print(a[1:r]) の所に,本来意図している処理プログラムを書く。
while (TRUE) {
print(a[1:r])
a = next_combn(n, r, a)
if (length(a) == 1) {
break
}
}