2017-08-30 1 views
0

Ich verwende das folgende Setup, um eine Liste von Charts zu erstellen.kann nicht verwendet werden ggsave nach marrangeGrob

Das funktioniert ziemlich gut:

library(grid) 
library(gridExtra) 
library(ggplot2) 

mycols <- c('year','displ') 

mylist <- list() 
for(item in mycols){ 

    p <- ggplot(mpg, aes_string(x = 'hwy', y = item)) + 
    geom_point() 
    mylist[[(length(mylist) +1)]] <- p 
} 

ml = marrangeGrob(grob = mylist, nrow=2, ncol=1) 
ggsave("P://multipage.pdf", ml, width =10, height = 5) 

in der Schleife jedoch, ersetzt:

Fehler in $<-.data.frame (*tmp* "wrapvp", value = list (x = 0,5, y = 0,5,: Ersatz 17 Zeilen hat, Daten 234 hat

Was ist das Problem hier ? Einzeln, alle Diagramme in der Liste sehen gut aus.

Danke!

+0

Hey @MrFlick danke. Ich aktualisiere gerade jetzt. Ich habe einen interessanten Bug gefunden –

+0

Ja das ist wahr. lass mich versuchen mit dem üblichen Spielzeug Beispiel –

+0

@MrFlick wunderbar bearbeiten, denkst du nicht? :) –

Antwort

2

Das hat wirklich nichts mit marrangeGrob zu tun und hat damit zu tun, wie Sie Ihre Liste aufbauen. Vergleichen Sie die Struktur der Ausgabe dieser Methoden

out1 <- list() 
out1[[length(out1)+1]]<-list(a=1, b=2) 
out1[[length(out1)+1]]<-list(a=2, b=2) 
str(out1) 
# List of 2 
# $ :List of 2 
# ..$ a: num 1 
# ..$ b: num 2 
# $ :List of 2 
# ..$ a: num 2 
# ..$ b: num 2 

out2 <- list() 
out2 <- append(out2, list(a=1, b=2)) 
out2 <- append(out2, list(a=2, b=2)) 
str(out2) 
# List of 4 
# $ a: num 1 
# $ b: num 2 
# $ a: num 2 
# $ b: num 2 

Beachten Sie, dass sie unterschiedliche Strukturen produzieren. Die append() fügt die Elemente der "root" -Liste hinzu, anstatt die Liste in der Liste zu verschachteln. Sie können explizit tun, dass Sie sich mit und extra list()

out3 <- list() 
out3 <- append(out3, list(list(a=1, b=2))) 
out3 <- append(out3, list(list(a=2, b=2))) 
str(out3) 
# List of 2 
# $ :List of 2 
# ..$ a: num 1 
# ..$ b: num 2 
# $ :List of 2 
# ..$ a: num 2 
# ..$ b: num 2 

aber mit Schlaufen in R wie diese Unordnung selten notwendig ist. Es ist besser, einen integrierten Iterator wie lapply() oder Map() zu verwenden. Zum Beispiel

mylist <- lapply(mycols, function(item) { 
    ggplot(mpg, aes_string(x = 'hwy', y = item)) + 
    geom_point() 
}) 
+0

sehr klar und unterhaltsam. Vielen Dank! ein ekliges Beispiel für verschachtelte vs nicht-nested Loops –

Verwandte Themen