具体例: ベクトル x = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) について, 右ローテートを (10, 1, 2, 3, 4, 5, 6, 7, 8, 9) 左ローテートを (2, 3, 4, 5, 6, 7, 8, 9, 10, 1) とする。それぞれ n 回繰り返した結果は,右(左) n ローテートと呼ぶことにする。 プログラム例: ローテートする個数が決まっているなら,関数にしなくても良いかもしれない。 rotate.right <- function(x, n=1) { last <- length(x) for (i in 1:n) { x <- c(x[last], x[-last]) # 最後の要素を取り除いたベクトル(x[-last])の前に,最後の要素(x[last])を置く } x } rotate.left <- function(x, n=1) { for (i in 1:n) { x <- c(x[-1], x[1]) # 最初の要素を取り除いたベクトル(x[-1])の後に,最初の要素(x[1])を置く } x } for を使わない場合には,ローテートする個数のチェックなどが必要 要素を並べ替えるか,添え字を並べ替えるか二通りのやり方がある rotate.right <- function(x, n=1) { last <- length(x) n <- n %% last if (n) { c(x[(last-n+1):last], x[-((last-n+1):last)]) # または # x[c((last-n+1):last, 1:(last-n))] } else { x } } rotate.left <- function(x, n=1) { last <- length(x) n <- n %% last if (n) { c(x[-(1:n)], x[1:n]) # または # x[c((n+1):last, 1:n)] } else { x } } 実行結果: > x <- 1:20 > rotate.right(x) # 右(1)ローテート [1] 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 > rotate.left(x) # 左(1)ローテート [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1 > rotate.left(x, 5) # 左 5 ローテート [1] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5 > rotate.right(x, 7) # 右 7 ローテート [1] 14 15 16 17 18 19 20 1 2 3 4 5 6 7 8 9 10 11 12 13