2012-06-14 40 views
10

là có một cách đơn giản (ví dụ, thông qua một tùy chọn đoạn) để lấy mã nguồn của đoạn và cốt truyện nó tạo cạnh nhau, như trên trang 8 (trong số các trang khác) của this document?knitr - Cách sắp xếp mã và cốt truyện cạnh nhau

Tôi đã thử sử dụng out.width="0.5\\textwidth", fig.align='right', làm cho cốt truyện chỉ chiếm một nửa trang và được căn chỉnh ở bên phải, nhưng mã nguồn được hiển thị ở trên cùng, đó là hành vi bình thường. Tôi muốn có nó ở phía bên trái của cốt truyện.

Cảm ơn đang

mẫu:

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

trình bày đó đã được rất có thể đặt cùng với máy chiếu bằng cách sử dụng '\ cột {}' môi trường. Bạn đang thử điều tương tự với beamer trong LaTeX hoặc hiển thị thông qua một công cụ khác (LaTeX đơn giản, vv)? –

+3

@GavinSimpson đúng, [Tôi đã sử dụng '\ cột'] (https://github.com/baptiste/talks/blob/master/ggplot/presentation.rnw) – baptiste

+0

trong tài liệu latex chuẩn, tôi sẽ sử dụng' minipage' để thay thế – baptiste

Trả lời

2

Bạn có thể hiển thị văn bản trong một 'textplot' từ PerformanceAnalytics gói hoặc gplots.

(Ít) nhược điểm: Theo hiểu biết của tôi, không có đánh dấu cú pháp nào có thể.

Sample Code:

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

Tôi thấy 3 khả năng

  • cho beamer thuyết trình, tôi muốn đi cho \begin{columns} ... \end{columns} là tốt.
  • Nếu chỉ có một ô như vậy: Minipages
  • Here Tôi đã sử dụng bảng (mã cột và kết quả cột). (Ví dụ này là "bình thường" Sweave)

Đối với tất cả ba, các tùy chọn đoạn sẽ có include = FALSE, và cốt truyện sẽ "bằng tay" được đưa đến đúng địa chỉ của \includegraphics[]{}.

+0

Tôi thứ hai cách tiếp cận này. – user12202013

8

Vâng, điều này đã trở nên phức tạp hơn tôi mong đợi.

Ở bên LaTeX, adjustbox package cho phép bạn kiểm soát tốt việc căn chỉnh các hộp cạnh nhau, như được minh họa độc đáo in this excellent answer trên tex.stackexchange.com. Vì vậy, chiến lược chung của tôi là bao bọc đầu ra đã được định dạng, chỉnh sửa, được tô màu của đoạn R được chỉ định bằng mã LaTeX: (1) đặt nó vào trong môi trường adjustbox; và (2) bao gồm đầu ra đồ họa của chunk trong môi trường adjustbox khác ở bên phải của nó. Để thực hiện điều đó, tôi cần thay thế móc đầu ra chunk mặc định knitr với một tùy chỉnh, được xác định trong phần (2) của đoạn tài liệu <<setup>>= của tài liệu.

Mục (1) của <<setup>>= xác định móc nối có thể được sử dụng để tạm thời đặt bất kỳ tùy chọn toàn cục nào của R (và đặc biệt ở đây, options("width")) trên cơ sở mỗi đoạn. See here cho câu hỏi và câu trả lời chỉ xử lý một phần của thiết lập này.

Cuối cùng, mục (3) xác định mẫu "đan", một loạt các tùy chọn cần được đặt mỗi khi mã và hình bên cạnh được tạo ra. Sau khi được xác định, nó cho phép người dùng kích hoạt tất cả các hành động được yêu cầu bằng cách chỉ cần nhập opts.label="codefig" vào tiêu đề của đoạn.

\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

Mất bạn đủ lâu, trung thực :-) +1 –

Các vấn đề liên quan