2012-06-14 27 views
10

hay una manera simple (por ejemplo, mediante una opción de fragmento) de obtener el código fuente de un fragmento y el trazado que produce uno al lado del otro, como en la página 8 (entre otros) de this document?knitr - Cómo alinear código y gráfico uno al lado del otro

Intenté usar out.width="0.5\\textwidth", fig.align='right', lo que hace que la gráfica ocupe correctamente solo la mitad de la página y se alinee a la derecha, pero el código fuente se muestra encima, que es el comportamiento normal. Me gustaría tenerlo en el lado izquierdo de la trama.

Gracias código

muestra:

<<someplot, out.width="0.5\\textwidth", fig.align='right'>>= 
plot(1:10) 
@ 
+0

Esa presentación fue muy probablemente juntos con proyector usando las columnas '\ {}' medio ambiente. ¿Estás intentando lo mismo con beamer en LaTeX o renderizando a través de otro motor (LaTeX simple, etc.)? –

+3

@GavinSimpson correcto, [He usado '\ columns'] (https://github.com/baptiste/talks/blob/master/ggplot/presentation.rnw) – baptiste

+0

en un documento de látex estándar, utilizaría' minipage' en su lugar – baptiste

Respuesta

2

Se puede visualizar el texto en un 'textplot' de PerformanceAnalytics paquete o gplots.

(Poco) inconveniente: Que yo sepa, no es posible resaltar la sintaxis.

Código de ejemplo:

```{r fig.width=8, fig.height=5, fig.keep = 'last', echo=FALSE} 
suppressMessages(library(PerformanceAnalytics)) 
layout(t(1:2)) 
textplot('plot(1:10)') 
plot(1:10) 
``` 
4

veo 3 posibilidades

  • para beamer presentaciones, me gustaría ir a \begin{columns} ... \end{columns} también.
  • Si es solo uno de estos diagramas: Minipages
  • Here Utilicé una tabla (código de columna y resultado de columna). (Este ejemplo es Sweave "normal")

Para los tres, las opciones del pedazo tendría include = FALSE, y la trama sería "manualmente" se ponga en el lugar adecuado por \includegraphics[]{}.

+0

En segundo lugar este enfoque. – user12202013

8

Bueno, esto terminó siendo más complicado de lo que esperaba.

En el lado LaTeX, el adjustbox package le da un gran control sobre la alineación de las cajas una al lado de la otra, como muy bien demostrado in this excellent answer en tex.stackexchange.com. Así que mi estrategia general fue envolver la salida formateada, ordenada y coloreada del fragmento R indicado con el código LaTeX que: (1) lo coloca dentro de un entorno de cuadro de ajuste; y (2) incluye la salida gráfica del fragmento en otro entorno de caja de ajuste justo a su derecha. Para lograr eso, tuve que reemplazar knitr gancho de salida de fragmento por defecto con uno personalizado, definido en la sección (2) del trozo <<setup>>= del documento.

Sección (1) de <<setup>>= define un gancho trozo que se puede utilizar para fijar temporalmente cualquiera de las opciones globales de R (y en particular en este caso, options("width")) en función de cada trozo. See here para una pregunta y respuesta que trate solo esa pieza de esta configuración.

Finalmente, la sección (3) define una "plantilla" knitr, un paquete de varias opciones que deben establecerse cada vez que se producen un bloque de código y una figura uno al lado del otro. Una vez definido, le permite al usuario activar todas las acciones requeridas simplemente escribiendo opts.label="codefig" en el encabezado de un fragmento.

\documentclass{article} 

\usepackage{adjustbox}   %% to align tops of minipages 
\usepackage[margin=1in]{geometry} %% a bit more text per line 

\begin{document} 

<<setup, include=FALSE, cache=FALSE>>= 
## These two settings control text width in codefig vs. usual code blocks 
partWidth <- 45 
fullWidth <- 80 
options(width = fullWidth) 

## (1) CHUNK HOOK FUNCTION 
## First, to set R's textual output width on a per-chunk basis, we 
## need to define a hook function which temporarily resets global R's 
## option() settings, just for the current chunk 
knit_hooks$set(r.opts=local({ 
    ropts <- NA 
    function(before, options, envir) { 
     if (before) { 
      ropts <<- options(options$r.opts) 
     } else { 
      options(ropts) 
     } 
    } 
})) 

## (2) OUTPUT HOOK FUNCTION 

## Define a custom output hook function. This function processes _all_ 
## evaluated chunks, but will return the same output as the usual one, 
## UNLESS a 'codefig' argument appeared in the chunk's header. In that 
## case, wrap the usual textual output in LaTeX code placing it in a 
## narrower adjustbox environment and setting the graphics that it 
## produced in another box beside it. 

defaultChunkHook <- environment(knit_hooks[["get"]])$defaults$chunk 

codefigChunkHook <- function (x, options) { 
     main <- defaultChunkHook(x, options) 
     before <- 
      "\\vspace{1em}\n 
      \\adjustbox{valign=t}{\n 
      \\begin{minipage}{.59\\linewidth}\n" 
     after <- 
      paste("\\end{minipage}} 
        \\hfill 
        \\adjustbox{valign=t}{", 
        paste0("\\includegraphics[width=.4\\linewidth]{figure/", 
          options[["label"]], "-1.pdf}}"), sep="\n") 
    ## Was a codefig option supplied in chunk header? 
    ## If so, wrap code block and graphical output with needed LaTeX code. 
    if (!is.null(options$codefig)) { 
     return(sprintf("%s %s %s", before, main, after)) 
    } else { 
     return(main) 
    } 
} 

knit_hooks[["set"]](chunk = codefigChunkHook) 


## (3) TEMPLATE 
## codefig=TRUE is just one of several options needed for the 
## side-by-side code block and a figure to come out right. Rather 
## than typing out each of them in every single chunk header, we 
## define a _template_ which bundles them all together. Then we can 
## set all of those options simply by typing opts.label="codefig". 

opts_template[["set"]](
codefig = list(codefig=TRUE, fig.show = "hide", 
       r.opts = list(width=partWidth), 
       tidy = TRUE, 
       tidy.opts = list(width.cutoff = partWidth))) 
@ 

A chunk without \texttt{opts.label="codefig"} set... 
<<A>>= 
1:60 
@ 

\texttt{opts.label="codefig"} \emph{is} set for this one 

<<B, opts.label="codefig", fig.width=8, cache=FALSE>>= 
library(raster) 
library(RColorBrewer) 

## Create a factor raster with a nice RAT (Rast. Attr. Table) 
r <- raster(matrix(sample(1:10, 100, replace=TRUE), ncol=10, nrow=10)) 
r <- as.factor(r) 
rat <- levels(r)[[1]] 
rat[["landcover"]] <- as.character(1:10) 
levels(r) <- rat 

## To get a nice grid... 
p <- as(r, "SpatialPolygonsDataFrame") 

## Plot it 
plot(r, col = brewer.pal("Set3", n=10), 
    legend = FALSE, axes = FALSE, box = FALSE) 
plot(p, add = TRUE) 
text(p, label = getValues(r)) 
@ 

\texttt{opts.label="codefig"} not set, and all settings back to ``normal''. 
<<C>>= 
lm(mpg ~ cyl + disp + hp + wt + gear, data=mtcars) 
@ 


\end{document} 

enter image description here

+0

te llevó lo suficiente, sinceramente :-) +1 –

Cuestiones relacionadas