多重ループを一重ループに変えるための範囲リスト作成
コメント等はこちらのページにどうぞ -> 多重ループを一重ループに変えるための範囲リスト作成へのコメント
解説:
注意:
TODO:
mult.range <- function(x, y) { # x, y はループ範囲を与えるベクトル mr <- as.list(NA) # 空リスト ct <- 0 # 添字カウンタ for (i in x) for (j in y) mr[[ct <- ct +1]] <- c(i, j) return(mr) }
使用例:
> Range <- mult.range(1:10, 1:5) > for (i in 1:10) for (j in 1:5) i+j # 二重ループ > for (x in Range) x[1] + x[2] # 上の一重ループ化。x[1], x[2] がループ変数の役目 > Range[[1]] # 1 番目の成分 [1] 1 1
> Range <- mult.range(mult.range(1:10, 1:5), 1:20) > for (i in 1:10) for (j in 1:5) for(k in 1:20) foo(i, j, k) # 3重ループ > for (x in Range) foo(x[1], x[2], x[3]) # 上の一重ループ化 (コードが簡潔!)
> Range <- mult.range(1:10, runif(5)) # ループ範囲は実数ベクトルでも良い > m <- 0 > for (x in Range) m <- m + x[1]*x[2] > m [1] 73.22538 > length(Range) # 多重ループ範囲リストの成分数 [1] 50 > x <- Range[[12]] # 12 番目の成分 > x [1] 3.0000000 0.6013451 # 実数化されている! > (1:10)[x[1]] # しかし、そのまま配列の添字等に使ってOK(自動的に整数に強制変換されるらしい?) [1] 3
> Range <- mult.range(1:3, c("A", "B", "C")) # ループ範囲が文字ベクトル > Range[[10]] [1] "4" "A" # まずい、数字が文字化されている(ベクトルに数字と文字は一緒に入れられない) > for (x in Range) cat(x[2], " is ", as.integer(x[1]), "\n") # しょうがないから整数化 A is 1 B is 1 C is 1 (以下略)