518 lines
8.1 KiB
Plaintext
518 lines
8.1 KiB
Plaintext
#LyX 2.0 created this file. For more info see http://www.lyx.org/
|
|
\lyxformat 413
|
|
\begin_document
|
|
\begin_header
|
|
\textclass article
|
|
\use_default_options true
|
|
\begin_modules
|
|
knitr
|
|
\end_modules
|
|
\maintain_unincluded_children false
|
|
\language english
|
|
\language_package none
|
|
\inputencoding default
|
|
\fontencoding global
|
|
\font_roman palatino
|
|
\font_sans default
|
|
\font_typewriter default
|
|
\font_default_family default
|
|
\use_non_tex_fonts false
|
|
\font_sc true
|
|
\font_osf false
|
|
\font_sf_scale 100
|
|
\font_tt_scale 100
|
|
|
|
\graphics default
|
|
\default_output_format default
|
|
\output_sync 0
|
|
\bibtex_command default
|
|
\index_command default
|
|
\paperfontsize default
|
|
\spacing single
|
|
\use_hyperref true
|
|
\pdf_bookmarks true
|
|
\pdf_bookmarksnumbered true
|
|
\pdf_bookmarksopen true
|
|
\pdf_bookmarksopenlevel 2
|
|
\pdf_breaklinks false
|
|
\pdf_pdfborder false
|
|
\pdf_colorlinks false
|
|
\pdf_backref false
|
|
\pdf_pdfusetitle true
|
|
\pdf_quoted_options "pdfstartview={XYZ null null 1}"
|
|
\papersize default
|
|
\use_geometry true
|
|
\use_amsmath 1
|
|
\use_esint 1
|
|
\use_mhchem 1
|
|
\use_mathdots 1
|
|
\cite_engine basic
|
|
\use_bibtopic false
|
|
\use_indices false
|
|
\paperorientation portrait
|
|
\suppress_date false
|
|
\use_refstyle 1
|
|
\index Index
|
|
\shortcut idx
|
|
\color #008000
|
|
\end_index
|
|
\leftmargin 2.5cm
|
|
\topmargin 2.5cm
|
|
\rightmargin 2.5cm
|
|
\bottommargin 2.5cm
|
|
\secnumdepth 3
|
|
\tocdepth 3
|
|
\paragraph_separation indent
|
|
\paragraph_indentation default
|
|
\quotes_language english
|
|
\papercolumns 1
|
|
\papersides 1
|
|
\paperpagestyle default
|
|
\listings_params "language=R"
|
|
\tracking_changes false
|
|
\output_changes false
|
|
\html_math_output 0
|
|
\html_css_as_file 0
|
|
\html_be_strict false
|
|
\end_header
|
|
|
|
\begin_body
|
|
|
|
\begin_layout Standard
|
|
\begin_inset ERT
|
|
status open
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
<<setup, include=FALSE, cache=FALSE>>=
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
library(knitr)
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
opts_chunk$set(fig.path = 'figure/listings-')
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
options(formatR.arrow = TRUE)
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
render_listings()
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
@
|
|
\end_layout
|
|
|
|
\end_inset
|
|
|
|
|
|
\end_layout
|
|
|
|
\begin_layout Title
|
|
Using listings with knitr
|
|
\end_layout
|
|
|
|
\begin_layout Author
|
|
Yihui Xie
|
|
\end_layout
|
|
|
|
\begin_layout Standard
|
|
To use the
|
|
\series bold
|
|
listings
|
|
\series default
|
|
package with
|
|
\series bold
|
|
knitr
|
|
\series default
|
|
, all you need to do is to call a function in your first setup chunk (that
|
|
chunk should be hidden from the output with
|
|
\family typewriter
|
|
include=FALSE
|
|
\family default
|
|
and should not be cached):
|
|
\end_layout
|
|
|
|
\begin_layout Standard
|
|
\begin_inset ERT
|
|
status open
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
% I just want to echo the 2nd line
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
<<setup, echo=2>>=
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
@
|
|
\end_layout
|
|
|
|
\end_inset
|
|
|
|
|
|
\end_layout
|
|
|
|
\begin_layout Standard
|
|
This function modifies the output hooks and header information so that the
|
|
output is written in
|
|
\series bold
|
|
listings
|
|
\series default
|
|
environments, which are kindly provided by Frank Harrell and can be found
|
|
in
|
|
\begin_inset Flex URL
|
|
status collapsed
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
https://github.com/yihui/knitr/blob/master/inst/misc/Sweavel.sty
|
|
\end_layout
|
|
|
|
\end_inset
|
|
|
|
.
|
|
Of course you have to install the
|
|
\series bold
|
|
listings
|
|
\series default
|
|
package if your LaTeX toolset does not include this package.
|
|
\end_layout
|
|
|
|
\begin_layout Standard
|
|
Now we can see how the results look like with our new settings:
|
|
\end_layout
|
|
|
|
\begin_layout Standard
|
|
\begin_inset ERT
|
|
status open
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
<<boring-random>>=
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
set.seed(1121) # for reproducibility
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
options(width=85)
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
x=rnorm(20)
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
x
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
mean(x)
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
sqrt(-1) # this will give you a warning message
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
@
|
|
\end_layout
|
|
|
|
\end_inset
|
|
|
|
|
|
\end_layout
|
|
|
|
\begin_layout Standard
|
|
Another chunk:
|
|
\end_layout
|
|
|
|
\begin_layout Standard
|
|
\begin_inset ERT
|
|
status open
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
<<rgl-hook-demo,eval=FALSE>>=
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
hook_rgl = function(before, options, envir) {
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
## after a chunk has been evaluated
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
if (before || !require('rgl') || rgl.cur() == 0) return() # no active
|
|
device
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
name = paste(valid_prefix(options$fig.path), options$label, sep = '')
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
par3d(windowRect = 100 + options$dpi * c(0, 0, options$width, options$height
|
|
))
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
Sys.sleep(.05) # need time to respond to window size change
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
fmt = opts_knit$get('out.format')
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
if (fmt %in% c('html', 'markdown', 'gfm', 'jekyll')) options$dev = 'png'
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
## support 3 formats: eps, pdf and png (default)
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
switch(options$dev,
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
postscript = rgl.postscript(paste(name, '.eps', sep = ''), fmt
|
|
= 'eps'),
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
pdf = rgl.postscript(paste(name, '.pdf', sep = ''), fmt = 'pdf'),
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
rgl.snapshot(paste(name, '.png', sep = ''), fmt = 'png'))
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
if (fmt == 'html') return(.plot.hook.html(c(name, 'png'), options))
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
if (fmt %in% c('markdown', 'gfm', 'jekyll'))
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
return(.plot.hook.markdown(c(name, 'png'), options))
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
paste(ifelse(options$align == 'center', '
|
|
\backslash
|
|
|
|
\backslash
|
|
centering{}', ''), '
|
|
\backslash
|
|
|
|
\backslash
|
|
includegraphics[',
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
sprintf('width=%s', options$out.width), ']{', name, '}
|
|
\backslash
|
|
n', sep = '')
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
}
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
@
|
|
\end_layout
|
|
|
|
\end_inset
|
|
|
|
|
|
\end_layout
|
|
|
|
\begin_layout Standard
|
|
Well, we can do crazier things with
|
|
\series bold
|
|
knitr
|
|
\series default
|
|
.
|
|
Here we use the
|
|
\family typewriter
|
|
fig.cap
|
|
\family default
|
|
option to write plots into the
|
|
\family typewriter
|
|
figure
|
|
\family default
|
|
environment automatically, and the caption is generated from data dynamically
|
|
(see Figure
|
|
\begin_inset ERT
|
|
status collapsed
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
|
|
\backslash
|
|
ref{fig:boxplot-ex}
|
|
\end_layout
|
|
|
|
\end_inset
|
|
|
|
):
|
|
\end_layout
|
|
|
|
\begin_layout Standard
|
|
\begin_inset ERT
|
|
status open
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
% set an option first
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
<<eval-opts, echo=FALSE>>=
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
opts_knit$set(eval.after = 'fig.cap') # evaluate fig.cap after the chunk
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
<<boxplot-ex, fig.height=2, out.width='.8
|
|
\backslash
|
|
|
|
\backslash
|
|
linewidth', fig.cap=sprintf('This is a boxplot; the median is %.2f.', median(x))>>=
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
par(mar=c(4,4,.1,.1))
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
boxplot(x, horizontal=TRUE)
|
|
\end_layout
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
@
|
|
\end_layout
|
|
|
|
\end_inset
|
|
|
|
|
|
\end_layout
|
|
|
|
\begin_layout Standard
|
|
As we know,
|
|
\family typewriter
|
|
figure
|
|
\family default
|
|
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.
|
|
\end_layout
|
|
|
|
\begin_layout Standard
|
|
You should be able to compile the TeX document and get a PDF file like this
|
|
one:
|
|
\begin_inset Flex URL
|
|
status collapsed
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
https://github.com/yihui/knitr/releases/download/doc/knitr-listings.pdf
|
|
\end_layout
|
|
|
|
\end_inset
|
|
|
|
.
|
|
For more information about out hooks, see
|
|
\begin_inset Flex URL
|
|
status collapsed
|
|
|
|
\begin_layout Plain Layout
|
|
|
|
https://yihui.org/knitr/hooks/
|
|
\end_layout
|
|
|
|
\end_inset
|
|
|
|
.
|
|
\end_layout
|
|
|
|
\end_body
|
|
\end_document
|