xとyが整数である8つの論理ベクトルのリストを返す関数f(x、y)があります。 M(x、y、z)がf(x、y)のz番目の要素のTRUEの数であるように、3次元配列Mを作成したいと思います。私は入れ子になったforループでこれを行うことができますが、それらはRで欲しがっていることを知っています。outer
またはrbind
とsapply
のどちらかを使ってよりエレガントな方法があると思います。ネストされたforループのコードは次のとおりです。R:リストから配列を取り込む
M <- array(dim=c(150, 200, 8))
for(j in 1:150) {
for(k in 1:200) {
rsu <- f(j, k)
for(z in 1:8) {
M[j, k, z] <- sum(rsu[[z]])
}}}
同じ結果をもたらすより効率的でエレガントな方法を教えてください。
編集:この質問の目的のために、fをブラックボックスとして扱います。現実には、それは、8つの異なる衛星に関する様々な計算やルックアップを必要とするが、ここではこの例では、いくつかのデータを生成しますダミー関数です:
is.prime <- function(n) n == 2L || all(n %% 2L:ceiling(sqrt(n)) != 0)
#source for is.prime function:
# https://stackoverflow.com/questions/19767408/prime-number-function-in-r
f <- function(x,y) {
retlist <- list()
retlist[[1]] <- c(FALSE, FALSE, rep(TRUE, x))
retlist[[2]] <- c(TRUE, TRUE, rep(FALSE, y), rep(TRUE, y))
retlist[[3]] <- c(is.prime(x), is.prime(y), is.prime(x+y), is.prime(x+y+3), sapply(x:(2*(x+y)), is.prime))
retlist[[4]] <- c(x+y %% 5 == 0, x*y %% 6 ==0)
retlist[[5]] <- retlist[[(x+y) %% 4 + 1]]
retlist[[6]] <- retlist[[y %% 4 + 1]]
retlist[[7]] <- retlist[[x %% 6 + 1]]
retlist[[8]] <- sapply(abs(x-y):(7L*x+y+1), is.prime)
return(retlist)
}
は 'FでF(j、k)は'コードがエラーを与えている 'エラー(j、k)はどのようなものです:私は投稿する自由ではないよ@akrun' – akrun
を機能 "F" を見つけることができませんでした実際の関数fですが、いくつかのデータを与えるダミー関数を提供するための例を編集しました。 –