2012-07-26 20 views
13

Hola me gustaría cambiar las opciones del pedazo, mediados trozo, sin tener que crear un nuevo trozo ..Cómo cambiar knitr opciones en la mitad trozo

ejecutar el siguiente código que se puede esperar para obtener dos salidas de tamaño muy diferentes, pero por alguna razón, este no parece ser el caso.

También el segundo gráfico no traza en absoluto ... (lo hace cuando lo cambia a trazar (2: 1000) ... pero en cualquier caso el segundo resultado es del mismo tamaño que el primero. Ambos fig.width=7 . ¿Qué estoy haciendo mal?

PLS nota de la importancia de la 'mitad trozo' la razón de esto es que me gustaría cambiar las opciones del pedazo varias veces cuando se ejecuta una función para obtener diferentes salidas de diferentes tamaños.

```{r} 
sessionInfo() 

opts_chunk$set(fig.width=3) 

plot(1:1000) 

opts_chunk$set(fig.width=10) 

plot(1:1000) 

``` 

la salida sessionInfo es como sigue:

## 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

teóricamente te podría permitir usar 'fig.width = c (3, 10)' y guardar las dos gráficas en 3 y 10 pulgadas respectivamente, pero el problema es cuando grabo las gráficas, solo puedo usar una tamaño por segmento, por lo que sus gráficos pueden no verse bien si el tamaño de grabación y el tamaño del dibujo son diferentes (consulte el [manual de gráficos]) (https://github.com/downloads/yihui/knitr/knitr-graphics.pdf) para más detalles) –

+0

http://stackoverflow.com/q/11653573/559676 debe ser un buen ejemplo para mostrarle cómo construir fragmentos de código de manera programable y tejerlos; puede ser más complicado que ese caso, pero puedes hacerlo de todos modos –

Respuesta

5

Dos preguntas: Cuando se desea que ambas cifras a mantenerse, utilizan

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

defecto sólo mantiene las parcelas únicas (porque sus dos parcelas son idénticos, la segunda se elimina; ver el knitr graphics manual para más detalles).

opciones trozo Global están activos cuando el siguiente fragmento (s) abierta:

```{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

De acuerdo en la parte 'fig.keep = 'all''. Gracias por eso, lo agradezco ... pero el objetivo de la parte principal de la pregunta NO fue dividir el código en fragmentos separados ... como mencioné, estoy ejecutando una sola función que produce imágenes con diferentes tamaños de salida. para ser creado y configurar el 'fig.width' para que todo el fragmento esté bien para algunas imágenes hace que otras sean demasiado pequeñas o demasiado grandes, por lo tanto, quería editar el código para poner un' opts_current $ set (fig.width = x) 'entre las tramas en la función. –

+0

Gracias por editar, @Yihui, estos fig.keep eran reliquias. –

+0

@ h.l.m la respuesta corta es no, no es posible usar 'opts_current' de esa manera. –

9

Esto funciona para mí, sobre la base de indicios de Yui en 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} 

Así que una cosa clave es establecer el progreso y detallado a F de otro modo destruyen la salida. Luego, la pequeña función kexpand expande una plantilla en línea que se escribe como texto como parte de la función. Luego puede definir su trazado como .q y su leyenda como límite, y sus alturas, etc. Podría adaptar la función para controlar otras opciones. Extrañamente, .q y los subtítulos no tienen que ser parámetros para la función, solo puede configurarlos en el entorno actual y la función los capta de todos modos. No sé si esto es una buena práctica o por qué funciona, pero lo hace.

+0

Por alguna razón, esto solo funciona para mí si sigo exactamente tu ejemplo. Si tengo gráficos que no sean ggplot, (base R, trama del bosque metafor), no funciona. Aún más extraño, si tengo las alturas en un vector y hago un círculo en el vector creando figuras, tampoco funciona. ¿Tiene alguna idea de si su método puede cambiarse para que funcione en mi caso? http://stackoverflow.com/questions/37998364 – rumtscho

Cuestiones relacionadas