107 lines
3.8 KiB
Plaintext
Raw Normal View History

2025-01-12 00:52:51 +08:00
%% LyX 2.2.1 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{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}}
\usepackage{breakurl}
\usepackage{listings}
\lstset{language=R}
\begin{document}
<<setup, include=FALSE, cache=FALSE>>=
library(knitr)
opts_chunk$set(fig.path = 'figure/listings-')
options(formatR.arrow = 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
<<setup, echo=2>>=
@
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:
<<boring-random>>=
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:
<<rgl-hook-demo,eval=FALSE>>=
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
<<eval-opts, echo=FALSE>>=
opts_knit$set(eval.after = 'fig.cap') # evaluate fig.cap after the chunk
<<boxplot-ex, fig.height=2, out.width='.8\\linewidth', fig.cap=sprintf('This is a boxplot; the median is %.2f.', median(x))>>=
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://github.com/yihui/knitr/releases/download/doc/knitr-listings.pdf}.
For more information about out hooks, see \url{https://yihui.org/knitr/hooks/}.
\end{document}