2012-07-26 11 views
13

Ciao vorrei modificare le opzioni di chunk, a metà pezzo, senza dover creare un nuovo pezzo ..Come cambiare knitr opzioni metà pezzo

eseguire il seguente codice mi aspetto di ottenere due uscite di dimensioni molto diverse, ma per qualche ragione questo non sembra essere il caso.

Anche il secondo grafico non traccia per niente ... (lo fa quando lo si modifica in plot (2: 1000) ... ma in entrambi i casi il secondo output ha le stesse dimensioni del primo. Entrambi fig.width=7 . che cosa sto facendo di sbagliato?

Pls nota l'importanza di 'mid pezzo' la ragione di questo è che vorrei cambiare le opzioni chunk più volte durante l'esecuzione di una funzione per ottenere diversi risultati di diverse dimensioni.

```{r} 
sessionInfo() 

opts_chunk$set(fig.width=3) 

plot(1:1000) 

opts_chunk$set(fig.width=10) 

plot(1:1000) 

``` 

l'uscita sessionInfo è la seguente:

## R version 2.15.1 (2012-06-22) 
## Platform: i386-pc-mingw32/i386 (32-bit) 
## 
## locale: 
## [1] LC_COLLATE=English_United Kingdom.1252 
## [2] LC_CTYPE=English_United Kingdom.1252 
## [3] LC_MONETARY=English_United Kingdom.1252 
## [4] LC_NUMERIC=C       
## [5] LC_TIME=English_United Kingdom.1252  
## 
## attached base packages: 
## [1] stats  graphics grDevices datasets utils  methods base  
## 
## other attached packages: 
## [1] knitr_0.7 
## 
## loaded via a namespace (and not attached): 
## [1] digest_0.5.2 evaluate_0.4.2 formatR_0.5 parser_0.0-16 
## [5] plyr_1.7.1  Rcpp_0.9.13 stringr_0.6 tools_2.15.1 

html preview

+1

in teoria potrei permettervi di usare 'fig.width = c (3, 10)' e salvare i due grafici rispettivamente in 3 e 10 pollici, ma il problema è quando registro i grafici, posso usare solo uno dimensione per pezzo, quindi i tuoi grafici potrebbero non sembrare giusti se le dimensioni di registrazione e le dimensioni del disegno sono diverse (vedi il [manuale grafico] (https://github.com/downloads/yihui/knitr/knitr-graphics.pdf) per i dettagli) –

+0

http://stackoverflow.com/q/11653573/559676 dovrebbe essere un buon esempio per mostrare come costruire pezzi di codice in modo programmabile e lavorarli a maglia; può essere più complicato di quel caso, ma puoi farlo comunque –

risposta

5

Due domande: Quando si desidera entrambe le figure siano tenere, utilizzare

```{r fig.keep='all'} 

predefinito conserva solo le trame uniche (perché i due lotti sono identici, il secondo viene rimosso; vedere lo knitr graphics manual per i dettagli).

opzioni chunk globale sono attive quando il prossimo pezzo (s) aperto:

```{r} 
opts_chunk$set(fig.width=10) 
``` 


```{r} 
opts_chunk$set(fig.width=2) 
# Our figure is 10 wide, not 2 
plot(1:1000) 
``` 

```{r} 
# Our figure is 2 wide, not 10 
opts_chunk$set(fig.width=10) 
plot(1:1000) 
``` 
+0

concordato sulla parte 'fig.keep = 'all''. Grazie per questo, lo apprezzo ... ma il punto principale della parte principale della domanda era NON scomporre il codice in blocchi separati ... come ho detto, sto eseguendo una singola funzione che produce immagini di output di dimensioni diverse per essere creato e impostare 'fig.width' affinché l'intero chunk sia ok per alcune immagini rende gli altri troppo piccoli o troppo grandi, quindi ho voluto modificare il codice per mettere un' opts_current $ set (fig.width = x) tra i grafici della funzione. –

+0

Grazie per la modifica, @Yihui, queste fig.keep erano delle reliquie. –

+0

@ h.l.m la risposta breve è no, non è possibile usare 'opts_current' in questo modo. –

9

Questo funziona per me, sulla base di suggerimenti da Yui su GitHub.

\documentclass{article} 

\begin{document} 
<<setup,echo=FALSE>>= 
opts_knit$set(progress = F, verbose = F) 
opts_chunk$set(comment=NA, warning=FALSE,message=FALSE,fig.width=6, echo=F) 
kexpand=function(){ 
    cat(knit(
    text=knit_expand(text= 
        "<<yfig-{{cap}}-,fig.cap='{{cap}}',results='markup',echo=FALSE,fig.height={{figheight}},out.height={{outheight}}>>=\n 
        .q\n 
        @" 
) 
))} 
@ 

<<results='asis'>>= 
library(ggplot2) 
.q=qplot(1:10);cap="first caption";figheight=9;outheight=90 
kexpand() 
.q=qplot(1:20);cap="second caption";figheight=12;outheight=160 
kexpand() 

@ 
\end{document} 

Quindi una cosa fondamentale è impostare progress e verbose su F altrimenti distruggono l'output. Quindi la piccola funzione kexpand espande un modello in linea che viene digitato come testo come parte della funzione. Quindi è possibile definire il grafico come .q e la didascalia come cap, e le altezze ecc. È possibile adattare la funzione per controllare altre opzioni. Stranamente, .q e la didascalia non devono essere parametri per la funzione, è sufficiente impostarli nell'ambiente corrente e vengono comunque rilevati dalla funzione. Non so se questa è una buona pratica o perché funziona, ma lo fa.

+0

Per qualche ragione, questo funziona solo per me se seguo esattamente il tuo esempio. Se ho grafici diversi da ggplot, (base R, metafor trama della foresta) non funziona. Anche più strano, se ho le altezze in un vettore e loop attraverso il vettore che crea figure, non funziona neanche. Hai idea se il tuo metodo può essere modificato per funzionare nel mio caso? http://stackoverflow.com/questions/37998364 – rumtscho

Problemi correlati