2014-05-09 11 views
12

mi sento sempre chiedendo una variante della stessa domanda :(grid.arrange utilizzando elenco di trame

Recentemente ho ottenuto un elenco di complotti + tavolo da visualizzare sul grid.arrange utilizzando la funzione do.call

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

g1 <- ggplot(data.frame(x=c(0, 10)), aes(x)) + stat_function(fun=sin) 
g2 <- ggplot(data.frame(x=c(0, 10)), aes(x)) + stat_function(fun=tan) 
g3 <- ggplot(data.frame(x=c(0, 10)), aes(x)) + stat_function(fun=cos) 
g4 <- tableGrob(data.frame(x <- 1:10, y<-2:11, z<-3:12)) 

plist <- list(g1,g2,g3,g4) 
do.call("grid.arrange", c(plist)) 

questo funziona, ma ho bisogno "plist" per essere generate in base alle variabili "numruns" che ho provato questo, ma non funziona:

plist2 <- list(paste0("g", seq_len(numruns+1))) 
do.call("grid.arrange", c(plist2)) 

credo quello che ho' m doing sta chiamando grid.arrange ("g1", "g2", ...) piuttosto che grid.arrange (g1, g2, ...). Ho risolto un problema simile prima di usare lapply, ma in questo caso non sembra essermi d'aiuto, oppure lo sto usando in modo errato.

Grazie per qualsiasi aiuto.

+2

Lei sembra essere alla ricerca di ' mget'. Che ne hai bisogno indica che il tuo vero problema è come si generano le trame. Dovrebbero essere messi in una lista quando vengono generati e non essere salvati come oggetti separati. – Roland

+0

Grazie a Roland, mi sono imbattuto in mget prima e purtroppo l'ho usato senza capirlo completamente. Sembra che il mio processo sia errato? C'è un esempio simile a cui potresti essere in grado di indicarmi? – user3564760

+1

Hai fatto una ricerca su '[r] mget ggplot'? Sono abbastanza sicuro che troverai esempi funzionanti. –

risposta

13

Si potrebbe usare mget come questo:

plist2 <- mget(paste0("g", 1:4)) 
do.call(grid.arrange, plist2) 

Ma sarebbe meglio mettere le trame in una lista quando la loro creazione, in questo modo:

funs <- c(sin, tan, cos) 
DF <- data.frame(x=c(0, 10)) 

g <- lapply(funs, function(fun, df) { 
    ggplot(df, aes(x)) + stat_function(fun=fun) 
}, df=DF) 

#g[[4]] <- tableGrob(data.frame(x = 1:10, y = 2:11, z = 3:12)) 
#better for programmatic use: 
g <- c(g, list(tableGrob(data.frame(x = 1:10, y = 2:11, z = 3:12)))) 

do.call(grid.arrange, g) 
+0

Grazie Roland. Mi viene in mente ogni giorno quanto devo imparare in R. L'uso di mget era quello che stavo chiedendo, ma grazie per aver incluso le informazioni su come mettere le trame stesse in una lista. Ho visto questa spiegazione comparire prima e sembra essere la migliore pratica. – user3564760

Problemi correlati