2010-08-03 3 views
22

Я пытаюсь написать функцию, которая отображает график ggplot facet_wrap на нескольких страницах. Это просто взломать, поскольку эта функция, похоже, находится в списке функций ggplot2. Я делаю небольшие вычисления, чтобы найти количество страниц, которые мне нужны, количество строк моего data.frame, которые мне нужны на странице и т. Д. Я уверен, что все это работает.R + ggplot: отображение нескольких страниц

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

Моя проблема в том, что, обернув все это в цикле, как это, между функциями pdf() и dev.off(), является то, что цикл, кажется, не ждать ggplot делать свое дело, и прорывается через его цикл очень быстро и выводит недопустимый PDF.

Если установить i = 1 запустите pdf(), запустите приведенный выше код внутри для цикла, а затем установите i=2, а затем запустить код, и так далее, пока не надоест (i=3), затем выключить устройство в результате PDF является блестящий.

Есть ли способ, которым я могу заставить цикл for дождаться окончания окончательной строки, прежде чем перейти к следующей итерации?

ответ

29

Я думаю, что проблема в том, что вам нужна печать() вокруг вашей последней строки (p + ...), чтобы заставить ее фактически распечатать устройство внутри цикла for. , ,

+0

wow, который полностью работает. Я понятия не имел, что печать может быть использована так. –

+0

Это потому, что 'p' является объектом. Последняя строка вашего кода изменяет объект 'p', но затем вы хотите' print() 'it на устройство. – JoFrhwld

+0

Да, это общее препятствие. Иногда я пишу функцию в ggplot2 и опускаю 'print()' вокруг финальной части, поэтому не получаю никакого вывода ... – aL3xa

4

Точно. Страница 39 из книги ggplot2 говорит нам, что при создании объектов ggplot2 вы можете «визуализировать ее на экране с помощью print(). Это происходит автоматически при запуске в интерактивном режиме, но внутри цикла или функции вам нужно будет напечатать() это сам ».

Смежные вопросы