%% LyX 2.0.3 created this file. For more info, see http://www.lyx.org/. %% Do not edit unless you really know what you are doing. \documentclass{article} \usepackage[sc]{mathpazo} \usepackage[T1]{fontenc} \usepackage{listings} \lstset{language=R} \usepackage{geometry} \geometry{verbose,tmargin=2.5cm,bmargin=2.5cm,lmargin=2.5cm,rmargin=2.5cm} \usepackage{url} \usepackage[unicode=true,pdfusetitle, bookmarks=true,bookmarksnumbered=true,bookmarksopen=true,bookmarksopenlevel=2, breaklinks=false,pdfborder={0 0 1},backref=false,colorlinks=false] {hyperref} \hypersetup{ pdfstartview={XYZ null null 1}} \begin{document} <>= library(knitr) opts_chunk$set(fig.path = 'figure/listings-') options(replace.assign = TRUE) render_listings() @ \title{Using listings with knitr} \author{Yihui Xie} \maketitle To use the \textbf{listings} package with \textbf{knitr}, all you need to do is to call a function in your first setup chunk (that chunk should be hidden from the output with \texttt{include=FALSE} and should not be cached): % I just want to echo the 2nd line <>= @ This function modifies the output hooks and header information so that the output is written in \textbf{listings} environments, which are kindly provided by Frank Harrell and can be found in \url{https://github.com/yihui/knitr/blob/master/inst/misc/Sweavel.sty}. Of course you have to install the \textbf{listings} package if your \LaTeX{} toolset does not include this package. Now we can see how the results look like with our new settings: <>= set.seed(1121) # for reproducibility options(width=85) x=rnorm(20) x mean(x) sqrt(-1) # this will give you a warning message @ Another chunk: <>= hook_rgl = function(before, options, envir) { ## after a chunk has been evaluated if (before || !require('rgl') || rgl.cur() == 0) return() # no active device name = paste(valid_prefix(options$fig.path), options$label, sep = '') par3d(windowRect = 100 + options$dpi * c(0, 0, options$width, options$height)) Sys.sleep(.05) # need time to respond to window size change fmt = opts_knit$get('out.format') if (fmt %in% c('html', 'markdown', 'gfm', 'jekyll')) options$dev = 'png' ## support 3 formats: eps, pdf and png (default) switch(options$dev, postscript = rgl.postscript(paste(name, '.eps', sep = ''), fmt = 'eps'), pdf = rgl.postscript(paste(name, '.pdf', sep = ''), fmt = 'pdf'), rgl.snapshot(paste(name, '.png', sep = ''), fmt = 'png')) if (fmt == 'html') return(.plot.hook.html(c(name, 'png'), options)) if (fmt %in% c('markdown', 'gfm', 'jekyll')) return(.plot.hook.markdown(c(name, 'png'), options)) paste(ifelse(options$align == 'center', '\\centering{}', ''), '\\includegraphics[', sprintf('width=%s', options$out.width), ']{', name, '}\n', sep = '') } @ Well, we can do crazier things with \textbf{knitr}. Here we use the \texttt{fig.cap} option to write plots into the \texttt{figure} environment automatically, and the caption is generated from data dynamically (see Figure \ref{fig:boxplot-ex}): % set an option first <>= opts_knit$set(eval.after = 'fig.cap') # evaluate fig.cap after the chunk <>= par(mar=c(4,4,.1,.1)) boxplot(x, horizontal=TRUE) @ As we know, \texttt{figure} is a float environment, so it has floated away from the R code to the top of this page. This should not be surprising to \LaTeX{} users. You should be able to compile the \TeX{} document and get a PDF file like this one: \url{https://bitbucket.org/stat/knitr/downloads/knitr-listings.pdf}. For more information about out hooks, see \url{http://yihui.name/knitr/hooks}. \end{document}