2017-09-22 2 views
0

Ich habe eine Funktion f (x, y), die eine Liste von 8 logischen Vektoren zurückgibt, wobei x und y ganze Zahlen sind. Ich möchte ein dreidimensionales Array M so auffüllen, dass M [x, y, z] die Anzahl der TRUEs im z-ten Element von f (x, y) ist. Ich kann dies mit geschachtelten for-Schleifen tun, aber ich weiß, dass diese in R verpönt sind. Ich denke, es gibt einen eleganteren Weg, entweder outer oder rbind und sapply, aber ich kann es nicht herausfinden. Hier ist mein Code mit verschachtelten for-Schleifen:R: Füllen eines Arrays aus Listen

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]]) 
}}} 

Was ist eine effiziente/elegante Möglichkeit, diese Anordnung zu bevölkern, die das gleiche Ergebnis liefert?

Bearbeitet, um hinzuzufügen: Behandeln Sie für die Zwecke dieser Frage f als ein schwarzes Feld. In Wirklichkeit geht es um verschiedene Berechnungen und Lookups über acht verschiedene Satelliten, aber hier ist eine Dummy-Funktion, die einige Daten für dieses Beispiel generieren:

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

Was ist 'f (j, k)' Der Code wird geben Fehler 'Fehler in f (j, k): konnte nicht Funktion "f"' – akrun

+0

finden @akrun ich nicht frei bin posten die eigentliche Funktion f, aber ich habe das Beispiel bearbeitet, um eine Dummy-Funktion bereitzustellen, die einige Daten geben wird. –

Antwort

0

Hier ist, wie zum Bestücken des Array, um die gleichen Ergebnisse zu geben, mit verschachtelten Funktionen und sapply statt für:

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

Hier ist, wie es mit outer zu tun. Aber es ist nicht intuitiv; Die Matrixdaten werden innerhalb der Funktion zugewiesen. Ich verstehe nicht, warum ich Vectorize(f2) statt f2 hier aufrufen muss.

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)) 
Verwandte Themen