2010-08-03 21 views
22

Sto provando a scrivere una funzione che traccia un grafico ggplot facet_wrap su più pagine. È solo un trucco, poiché questa funzione sembra essere presente nella lista delle cose da fare della funzione ggplot2. Faccio alcuni piccoli calcoli per trovare il numero di pagine di cui ho bisogno, il numero di righe del mio data.frame di cui ho bisogno per pagina ecc. Sono abbastanza sicuro che tutto funzioni.R + ggplot: traccia su più pagine

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() 

mio problema è che, avvolgendo il tutto in un ciclo come questo, tra le pdf() e dev.off() funzioni, è che il ciclo non sembra aspettare che ggplot a fare la sua cosa, e attraversa il suo ciclo molto rapidamente e genera un PDF non valido.

Se ho impostato i = 1, avviare il pdf(), eseguire il codice sopra all'interno del ciclo for, quindi impostare i=2, quindi eseguire il codice, e così via fino a quando mi annoio (i=3) quindi spegnere il dispositivo PDF risultante è brillante.

C'è un modo per far sì che il ciclo for attenda che la linea finale termini il tracciamento prima di passare alla successiva iterazione?

risposta

29

Penso che il problema è che è necessario stampare() attorno all'ultima riga (p + ...) per farlo stampare sul dispositivo all'interno del ciclo for. . .

+0

wow che funzioni completamente. Non avevo idea che la stampa potesse essere usata in questo modo. –

+0

È perché 'p' è un oggetto. L'ultima riga del tuo codice modifica l'oggetto 'p', ma poi vuoi' print() 'sul dispositivo. – JoFrhwld

+0

Sì, è un ostacolo comune. A volte scrivo una funzione in ggplot2, e ometto 'print()' attorno alla parte finale, quindi non ottengo output ... – aL3xa

4

Esattamente. Pagina 39 del libro ggplot2 ci dice che quando crei oggetti ggplot2, puoi "Renderlo sullo schermo, con print(). Ciò accade automaticamente quando si esegue in modo interattivo, ma all'interno di un ciclo o funzione, è necessario stampare() te stesso ".

Problemi correlati