2015-04-08 14 views
8

Używam pętli for do tworzenia wielu dużych liczb na wielu stronach w jednym kawałku z knitr i rmarkdown. Działa dobrze dla programów word i html, ale ma jeden problem z wyjściem w formacie PDF.Jak dodać wiele figur na wielu stronach w kawałku za pomocą knitr i RMarkdown?

Jest to minimalny przykład RMarkdown do odtworzenia mojego problemu.

--- 
title: "Knitr test" 
date: "6 April 2015" 
output: pdf_document 
--- 


```{r, echo=FALSE, fig.width=6.5,fig.height=10} 
library(ggplot2) 
for (i in seq(1, 4)){ 
    p <- ggplot(cars, aes(speed, dist)) + geom_point() 
    print(p) 
} 
``` 

Wygenerowany plik pdf wygląda następująco. Dwie cyfry są drukowane na stronie.

enter image description here

Jeśli zmienię fig.height, dodać kilka sekcji w pliku RMD, dwie postacie nadal są drukowane na tej samej stronie z innym układzie.

--- 
title: "Knitr test" 
output: pdf_document 
date: "6 April 2015" 
--- 

## Section A 

Row B 

```{r plot_phenotype, echo = FALSE, fig.height=8, fig.width=6.5} 
library(ggplot2) 
for (i in seq(1, 4)) 
{ 
    p <- ggplot(cars, aes(speed, dist)) + geom_point() 
    print(p) 
} 

``` 

enter image description here

Dzięki za wszelkie sugestie, aby rozwiązać ten problem.

Używam RStudio 0.99.375. To są moje informacje o sesji.

sessionInfo() 
R version 3.1.3 (2015-03-09) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows 7 x64 (build 7601) Service Pack 1 

locale: 
[1] LC_COLLATE=English_Australia.1252 LC_CTYPE=English_Australia.1252 
[3] LC_MONETARY=English_Australia.1252 LC_NUMERIC=C      
[5] LC_TIME=English_Australia.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] rmarkdown_0.5.3.1 knitr_1.9.5  

loaded via a namespace (and not attached): 
[1] colorspace_1.2-5 digest_0.6.8  evaluate_0.5.5 formatR_1.0  
[5] ggplot2_1.0.0 grid_3.1.3  gtable_0.1.2  htmltools_0.2.6 
[9] MASS_7.3-34  munsell_0.4.2 plyr_1.8.1  proto_0.3-10  
[13] Rcpp_0.11.5  reshape2_1.4.1 scales_0.2.4  stringr_0.6.2 
[17] tcltk_3.1.3  tools_3.1.3  yaml_2.1.13  

Odpowiedz

12

Rozwiązałem mój problem.

W wygenerowanym pliku tex po każdym rysunku nie ma nowych wierszy. Ten kod tex wygenerował za pomocą pliku rmd powyżej:

\includegraphics{test_files/figure-latex/plot_phenotype-1.pdf} 
\includegraphics{test_files/figure-latex/plot_phenotype-2.pdf} 
\includegraphics{test_files/figure-latex/plot_phenotype-3.pdf} 
\includegraphics{test_files/figure-latex/plot_phenotype-4.pdf} 

Rozwiązaniem jest dodanie nowej linii po każdym cyklu w celu wydrukowania figury.

cat('\r\n\r\n') 

Nie wiem, dlaczego potrzebuję dwóch "\ r \ n" tutaj.Wygenerowany plik tex wygląda następująco:

\includegraphics{test_files/figure-latex/plot_phenotype-1.pdf} 

\includegraphics{test_files/figure-latex/plot_phenotype-2.pdf} 

\includegraphics{test_files/figure-latex/plot_phenotype-3.pdf} 

\includegraphics{test_files/figure-latex/plot_phenotype-4.pdf} 

To jest pełna przykładów z mojego RMD złożyć

--- 
title: "Knitr test" 
output: 
    pdf_document: 
    keep_tex: yes 
date: "6 April 2015" 
--- 

## Section A 

Row B 

```{r plot_phenotype, echo = FALSE, fig.height=8, fig.width=6.5} 
library(ggplot2) 
library(grid) 
for (i in seq(1, 4)) 
{ 
    grid.newpage() 
    p <- ggplot(cars, aes(speed, dist)) + geom_point() 

    print(p) 
    cat('\r\n\r\n') 
} 


``` 
+0

Jeśli działka, z którą pracujesz, jest łączem z wieloma wątkami, możesz zamienić 'print (p)' na 'grid.draw (p)' i nadal będzie działać. Jeśli nie, wyrenderuje również wynik TableGrob. –

4

Edycja 1 (LaTeX): Nie wydaje się uzyskać to do pracy z RMarkdown, ponieważ ma problemy z nowych stron. Ale używanie czystego LaTeXa wydaje się rozwiązywać problem z wieloma wykresami na jednej stronie i tekstem na początku. Nie jestem pewien, czy to jest to, czego chcesz. W RStudio otworzyć nowy R Sweave (.Rnw) plik i spróbuj:

\documentclass{article} 
\begin{document} 
\title{A report} 
\author{Me} 
\maketitle 
\section{One section} 
Some text that does not say anything interesting. 

<<r, echo=FALSE, fig.width=6.5, fig.height=7>>= 
library(ggplot2) 
for (i in seq(1, 4)){ 
    p <- ggplot(cars, aes(speed, dist)) + geom_point() 
    print(p) 
} 
@ 

\end{document} 

To daje następujące:

just a pdf

Edycja 2 (RMarkdown) (w oparciu o odpowiedź): uruchamiając kod z odpowiedzi otrzymuję pierwszą stronę z tekstem, a następnie pojedynczą stronę dla każdego wątku. Jeśli to, co chcesz, możesz uzyskać ten sam efekt po prostu stosując (czyli usunięcie grid.newpage, \r s i keep_tex):

--- 
title: "Knitr test" 
output: pdf_document 
date: "6 April 2015" 
--- 

## Section A 

Row B 

```{r plot_phenotype, echo = FALSE, fig.height=10, fig.width=6.5} 
library(ggplot2) 
for (i in seq(1, 4)) 
{ 
    p <- ggplot(cars, aes(speed, dist)) + geom_point() 

    print(p) 
    cat('\n\n') 
} 


``` 

która produkuje następujące:

other screenshot

przypadku zmiany fig.height to 7, otrzymasz taki sam wynik jak w LaTeX powyżej.

+0

Dzięki za sugestię. kot nie jest wymagany, jeśli wysokość zmieni się na 8. Tak, gra z wysokością może działać, ale nie wiesz, dlaczego spowodować ten problem dla innej wysokości. – Bangyou

+0

@Bangyou Tak, przepraszam, grałem z 'cat' i wysokością w tym samym czasie, więc nie zdawałem sobie sprawy, że wysokość była głównym problemem. Nie sądzę, że istnieje łatwy sposób na uzyskanie idealnego pliku pdf (przy użyciu RMarkdown) i zautomatyzowanej pętli for, w połączeniu z tekstem w ten sposób. Wydaje się, że zawsze łączy dwie strony na tej samej stronie. Moja odpowiedź naprawdę nie działa z dołączonymi sekcjami itd. –

+1

@Bangyou Zmieniłem swoją odpowiedź, używając zamiast tego LaTeXa, która działa dobrze. Cały RMarkdown do Markdown do pdf prawdopodobnie powoduje problemy z układem figur. –

Powiązane problemy