2010-08-03 25 views
22

Estoy tratando de escribir una función que traza un diagrama ggplot facet_wrap en varias páginas. Es solo un truco, ya que esta característica parece estar en la lista de tareas de la función ggplot2. Hago algunos pequeños cálculos para encontrar el número de páginas que voy a necesitar, el número de filas de mi data.frame que necesito por página, etc. Estoy bastante seguro de que todo esto funciona.R + ggplot: trazado en varias páginas

pdf(filename) 
for (i in seq(num_pages)){ 
    slice = seq(((i-1)*num_rows)+1,(i*num_rows)) 
    slice = slice[!(slice > nrow(df.merged))] 
    df.segment=df.merged[slice,] 
    p <- ggplot(df.segment, aes(y=mean,x=phenotype)) 
    p <- p + geom_bar(stat="identity",fill="white",colour="black") 
    p + facet_wrap("ID",scales="free_y",ncol=n_facets,nrow=n_facets) 
} 
dev.off() 

Mi problema es que, envolviéndolo todo en un bucle de este tipo, entre las pdf() y dev.off() funciones, es que el bucle no parece que esperar a que ggplot a hacer su cosa, y recorre su ciclo muy rápidamente y genera un PDF inválido.

Si fijo i = 1, iniciar el pdf(), ejecute el código anterior dentro del bucle, a continuación, establezca i=2, a continuación, ejecute el código, y así sucesivamente hasta que me aburro (i=3) y luego apague el dispositivo del PDF resultante es brillante.

¿Hay alguna manera de que el bucle for espere a que la línea final termine de trazar antes de pasar a la siguiente iteración?

Respuesta

29

Creo que el problema es que necesita imprimir() alrededor de su última línea (p + ...) para que realmente se imprima en el dispositivo dentro del ciclo for. . .

+0

wow que funciona completamente. No tenía idea de que la impresión se pudiera usar así. –

+0

Es porque 'p' es un objeto. La última línea de tu código modifica el objeto 'p', pero luego quieres' imprimirlo() 'al dispositivo. – JoFrhwld

+0

Sí, es un obstáculo común. A veces escribo una función en ggplot2, y omito 'print()' alrededor de la parte final, por lo tanto no obtengo salida ... – aL3xa

4

Exactamente. La página 39 del libro ggplot2 nos dice que cuando creas objetos ggplot2, puedes "Renderizarlo en la pantalla, con print(). Esto sucede automáticamente cuando se ejecuta interactivamente, pero dentro de un bucle o función, necesitarás imprimir() usted mismo ".

Cuestiones relacionadas