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)
}
Was ist 'f (j, k)' Der Code wird geben Fehler 'Fehler in f (j, k): konnte nicht Funktion "f"' – akrun
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. –