2012-06-26 12 views
5

Voglio creare una singola figura in R con due grafici in un file markdown con knitr. Normalmente, questo è facile da fare con layout(t(1:2)) o par(mfrow=c(1,2)). Posso farlo con knitr, o farà sempre due figure separate?Uso del layout con knitr

Ecco un esempio di lavoro minimo che crea un file chiamato ./junk.Rmd e ./junk.md nella vostra directory di lavoro insieme a due file ./figure/junkislands1.png (che comprende solo il primo trama) e ./figure/junkislands2.png (che include entrambe le trame che voglio).

require(knitr) 
temp <- "```{r junkislands, fig.width=8, fig.height=5} 
layout(t(1:2)) 
pie(islands) 
barplot(islands) 
```" 
cat(temp, file="junk.Rmd") 
knit("junk.Rmd", "junk.md") 

Il problema non è tanto che esso crea due file .png, ma piuttosto che il file Markdown junk.md include entrambi.

Quando faccio questo markdown in html, include entrambi i file .png quando voglio solo quello con entrambe le figure tracciate.

Ecco il file junk.md che viene generato da knitr:

```r 
par(mfrow = c(1, 2)) 
pie(islands) 
``` 

![plot of chunk junkislands](figure/junkislands1.png) 

```r 
barplot(islands) 
``` 

![plot of chunk junkislands](figure/junkislands2.png) 
+0

a rigor di termini, si tratta di un bug di 'knitr' (https://github.com/yihui/knitr/issues/292); Proverò a ripararlo più tardi; grazie –

+0

Ho [riparato] (https://github.com/yihui/knitr/commit/3508ddb86f0068c17570b3c71dc1e79414041627) questo bug nella versione di sviluppo: https://github.com/yihui/knitr#readme Puoi certamente usare 'fig .keep = 'last'', ma non sarà più necessario. –

risposta

11

Dai un'occhiata alla http://yihui.name/knitr/options e specificatamente fig.keep. Penso che si desidera fig.keep = 'last'

require(knitr) 
temp <- "```{r junkislands, fig.width=8, fig.height=5, fig.keep = 'last'} 
layout(t(1:2)) 
pie(islands) 
barplot(islands) 
```" 
cat(temp, file="junk.Rmd") 
knit("junk.Rmd", "junk.md") 

```r 
layout(t(1:2)) 
pie(islands) 
barplot(islands) 
``` 

![plot of chunk junkislands](figure/junkislands.png) 
+1

solo una nota a margine - puoi chiamare 'knit (text = temp)' direttamente invece di scrivere il testo su 'junk.Rmd'. –