順列を作ってみる

R には combn という組み合わせを作ってくれる関数がある。

> combn(1:3,2)
	 [,1] [,2] [,3]
[1,]    1    1    2
[2,]    2    3    3
> combn(letters[1:3],2)
	[,1] [,2] [,3]
[1,] "a"  "a"  "b" 
[2,] "b"  "c"  "c" 

けど順列を作ってくれる関数はなかったので、つくってみた。

permu <- function(x, n)
{
	iter <- function(n, x, ls) {
		if(n == 0){ ls }
		else{ sapply(x, function(xs) iter(n-1, x[x!=xs], rbind(ls, xs))) }
	}
	r <- iter(n, x, NULL)
	dim(r) <- c(n, length(r) / n)
	r
}


> permu(1:3, 2)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    1    2    2    3    3
[2,]    2    3    1    3    1    2
> permu(letters[1:3], 2)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] "a"  "a"  "b"  "b"  "c"  "c" 
[2,] "b"  "c"  "a"  "c"  "a"  "b" 

再帰を使って書いてあるから、あまり大きな数を指定できないな。
dim で形を整えてるとこも、ちと気に入らない。

再帰をループにして、apply系を使う方がいいのだろうけど、面倒なのでやめる。