2010-08-03 28 views
22

Próbuję napisać funkcję, która kreśli wykres ggplot facet_wrap na wielu stronach. To po prostu hack, ponieważ ta funkcja wydaje się znajdować na liście zadań funkcji ggplot2. Wykonuję małe obliczenia, aby znaleźć liczbę stron, których potrzebuję, liczbę rzędów mojego data.frame potrzebnych na stronę itd. Jestem przekonany, że to wszystko działa.R + ggplot: drukowanie na wielu stronach

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

Mój problem polega na tym, owijając to wszystko w pętli for jak ta, w między funkcjami pdf() i dev.off(), jest to, że na pętli nie wydaje się czekać na ggplot zrobić jego rzecz, i bardzo szybko przechodzi przez pętlę, a następnie generuje nieprawidłowy plik PDF.

Jeżeli ustawić i = 1, uruchom pdf() uruchomić powyższy kod wewnątrz pętli, a następnie ustawić i=2, a następnie uruchomić kod, i tak dalej, dopóki nie znudzi (i=3), a następnie wyłączyć urządzenie otrzymany PDF jest znakomity.

Czy istnieje sposób, aby uzyskać pętlę for, aby czekać na końcową linię, aby zakończyć drukowanie przed przejściem do następnej iteracji?

Odpowiedz

29

Myślę, że problem polega na tym, że musisz wydrukować() wokół ostatniej linii (p + ...), aby uzyskać faktyczne drukowanie na urządzeniu wewnątrz pętli for. . .

+0

wow, który działa całkowicie. Nie miałem pojęcia, że ​​druk może być używany w ten sposób. –

+0

To dlatego, że 'p' jest obiektem. Ostatnia linia twojego kodu modyfikuje obiekt 'p', ale wtedy chcesz' print() 'go do urządzenia. – JoFrhwld

+0

Tak, to powszechna przeszkoda. Czasami piszę funkcję w ggplot2 i pomijam 'print()' wokół ostatniej części, więc nie otrzymuję żadnego wyjścia ... – aL3xa

4

Dokładnie. Strona 39 książki ggplot2 mówi nam, że kiedy tworzysz obiekty ggplot2, możesz "renderować je na ekranie, z print(). Dzieje się to automatycznie, gdy działa interaktywnie, ale wewnątrz pętli lub funkcji, musisz wydrukować() samemu".

Powiązane problemy