2017-09-22 6 views
0

xとyが整数である8つの論理ベクトルのリストを返す関数f(x、y)があります。 M(x、y、z)がf(x、y)のz番目の要素のTRUEの数であるように、3次元配列Mを作成したいと思います。私は入れ子になったforループでこれを行うことができますが、それらはRで欲しがっていることを知っています。outerまたはrbindsapplyのどちらかを使ってよりエレガントな方法があると思います。ネストされた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) 
} 
+1

は 'FでF(j、k)は'コードがエラーを与えている 'エラー(j、k)はどのようなものです:私は投稿する自由ではないよ@akrun' – akrun

+0

を機能 "F" を見つけることができませんでした実際の関数fですが、いくつかのデータを与えるダミー関数を提供するための例を編集しました。 –

答えて

0

はここにネストされた関数を使用して、同じ結果を与える配列を、移入方法ですそして代わりのためのsapply

f2 <- function(x,y) { 
    rsu <- f(x,y) 
    values <- vapply(1:8, FUN=function(z) sum(rsu[[z]]), FUN.VALUE=1L) 
    } 
f3 <- function(x) array(data=t(sapply(1:200, FUN=function(w) f2(x,w))), dim=c(1,200,8)) 
M2 <- array(data=t(sapply(1:150, FUN=f3)), dim=c(150,200,8)) 
0

はここouterでそれを行う方法です。しかし、直感的ではありません。関数内でマトリックスデータが割り当てられます。なぜ私はf2の代わりにVectorize(f2)をここで呼び出す必要があるのか​​理解できません。

M2 <- array(dim=c(150, 200, 8)) 
f2 <- function(x, y) { 
    rsu <- f(x, y) 
    M2[x, y, ] <<- vapply(1:8, FUN=function(z) sum(rsu[[z]]), FUN.VALUE=1L) 
    return(0L) 
    } 
ABC <- outer(1:150, 1:200, Vectorize(f2)) 
関連する問題