Sweave and knitr Templates
NOTE: SUPERCEDED by knitr
and LaTeX Styles knitrl
and spaper
; See GitHub rlatex
Project
Using LaTeX Style Sweavel
| Output
The most advanced way to use
Sweave
is through the R package
SweaveListingUtils
(see the third approach on this page) which does things such as listing all the functions in all the attached packages and highlighting these function names in all R code listings.
SweaveListingUtils
uses LaTeX's
listings
package to pretty-print R code. The
Sweavel.sty
package for LaTeX uses
listings
similarly but provides an easier way to customize the output and does not need you to run an R function to set this up as
SweaveListingUtils
does.
Sweavel
substitutes LaTeX
listings
package commands for the usual
Sweave
Sinput
and
Soutput
environments. Having
\usepackage{Sweavel}
in your
.Rnw
file will cause
Sweave
to not use its default style package
Sweave.sty
. To install
Sweavel.sty
on your Linux/Unix system, download the
.sty
file (say to
/tmp
) and issue the following shell commands:
sudo cp /tmp/Sweavel.sty /usr/share/R/share/texmf/.
sudo mktexlsr
Alternatively, copy the
.sty
file to your project directory, especially if you want to customize it and have the local copy override any system copy.
Sweavel.sty
was updated June 2015 to require only black and white, using a different method to distinguish inputs and outputs.
With this approach, you can easily have LaTeX commands inside your R code by enclosing the command inside (* *). This is particularly useful for symbolic references to sections, pages, figures, and tables without the document. Here is a template using this approach.
pdf
output is found at the link above. There is a symbolic link to a section in the document in an R comment.
A pdf file with an advanced example along these lines is at
SweaveLatex.
%Usage: R CMD Sweave template3.Rnw = Sweave template3
% rubber -d template3 or pdflatex template3
% To get .R file: R CMD Stangle template3.Rnw = Stangle template3
\documentclass{article}
\usepackage{relsize,setspace} % used by latex(describe( ))
\usepackage{needspace}
\usepackage{url} % used in bibliography
\usepackage[superscript,nomove]{cite} % use if \cite is used and superscripts wanted
% Remove nomove if you want superscripts after punctuation in citations
\usepackage{lscape} % for landscape mode tables
\textwidth 6.75in % set dimensions before fancyhdr
\textheight 9.25in
\topmargin -.875in
\oddsidemargin -.125in
\evensidemargin -.125in
\usepackage{fancyhdr} % this and next line are for fancy headers/footers
\pagestyle{fancy}
\newcommand{\bc}{\begin{center}} % abbreviate
\newcommand{\ec}{\end{center}}
\newcommand{\code}[1]{{\smaller\texttt{#1}}}
\newcommand{\R}{{\normalfont\textsf{R}}{}}
\usepackage{Sweavel}
% Uncomment some of the following to use some alternatives:
% \def\Sweavesize{\normalsize} (changes size of typeset R code and output)
% \def\Rcolor{\color{black}}
% \def\Routcolor{\color{green}}
% \def\Rcommentcolor{\color{red}}
% To change background color or R code and/or output, use e.g.:
% \def\Rbackground{\color{white}}
% \def\Routbackground{\color{white}}
% To use rgb specifications use \color[rgb]{ , , }
% To use gray scale use e.g. \color[gray]{0.5}
% If you change any of these after the first chunk is produced, the
% changes will have effect only for the next chunk.
\SweaveOpts{keep.source=TRUE}
% To produce both postscript and pdf graphics, remove the eps and pdf
% parameters in the next line. Set default plot size to 6x4 in.
\SweaveOpts{prefix.string=graphics/plot, eps = FALSE, pdf = TRUE}
\SweaveOpts{width=5, height=3.5}
\title{An Analysis}
\author{Jane Doe\\\smaller Department of Biostatistics\\\smaller Vanderbilt University School of Medicine}
\begin{document}
\maketitle
% Use the following 3 lines for long reports needing navigation
\tableofcontents
%\listoftables
%\listoffigures % not used unless figure environments used
<<echo=f>>=
spar <- function(mar=c(3.25+bot-.45*multi,3.5+left,.5+top+.25*multi,.5+rt),
lwd = if(multi)1 else 1.75,
mgp = if(multi) c(1.5, .365, 0) else c(2.4-.4, 0.475, 0),
tcl = if(multi)-0.25 else -0.4,
bot=0, left=0, top=0, rt=0, ps=14,
mfrow=NULL, ...)
{
multi <- length(mfrow) > 0
par(mar=mar, lwd=lwd, mgp=mgp, tcl=tcl, ...)
if(multi) par(mfrow=mfrow)
}
options(SweaveHooks=list(fig=spar)) # run spar() before every plot
options(prompt=' ',continue=' ') # remove prompt characters at start of lines
require(rms)
@
\section{Descriptive Statistics}\label{descStats}
<<results=tex>>=
getHdata(support) # Use Hmisc/getHdata to get dataset from VU DataSets wiki
d <- subset(support, select=c(age,sex,race,edu,income,hospdead,slos,dzgroup,
meanbp,hrt))
latex(describe(d), file='')
@
Race is reduced to three levels (white, black, OTHER) because of low
frequencies in other levels (minimum relative frequency set to 0.05).
<<>>=
d <- upData(d,
race = combine.levels(race, minlev = 0.05))
@
\section{Redundancy Analysis and Variable Interrelationships}
\bc
% Note: giving a chunk name to each code chunk that produces a figure
% makes it easy to know which plots to send to a collaborator, and
% will not allow numbered orphan plots to be left when code chunks are
% inserted into the file. The default in Sweave is for plots to be
% numbered by the chunks producing them.
<<vc,fig=t>>=
v <- varclus(~., data=d)
plot(v)
redun(~age+sex+race+edu+income+dzgroup+meanbp+hrt, data=d)
# Alternative: redun(~., data=subset(d, select=-c(hospdead,slos)))
@
\ec
Note that the clustering of black with white is not interesting; this just means that these are mutually exclusive higher frequency categories, causing them to be negatively correlated.
\section{Logistic Regression Model}
Here we fit a tentative binary logistic regression model. The
coefficients are not very useful so they are not
printed. Note: the symbolic section reference below was created by the
following \R\ comment:
\begin{verbatim}
# see Section (*\ref{descStats}*) for descriptive statistics
\end{verbatim}
The label was defined in an earlier section using
\begin{verbatim}
\section{Descriptive Statistics}\label{descStats}
\end{verbatim}
<<results=tex,fig=t,width=7,height=5>>=
dd <- datadist(d); options(datadist='dd')
f <- lrm(hospdead ~ rcs(age,4) + sex + race + dzgroup + rcs(meanbp,5),
data=d) # see Section (*\ref{descStats}*) for descriptive statistics
print(f, latex=TRUE, coefs=FALSE)
latex(anova(f), where='h', file='') # can also try where='htbp'
print(plot(Predict(f)))
@
\section{Test Calculations}
\bc
<<testp,fig=t>>=
x <- 3; y <- 2
if(x <= y) 'this' else 'that'
if(y >= x) 'that' else 'this'
x^y
plot(runif(20),runif(20))
@
\ec
\section{Computing Environment}
These analyses were done using the following versions of R\cite{Rsystem}, the
operating system, and add-on packages \code{Hmisc}\cite{Hmisc},
\code{rms}\cite{rrms}, and others:
<<echo=f,results=tex>>=
toLatex(sessionInfo(), locale=FALSE)
@
% Note: Rsystem reference is defined inside feh.bib. It is a slightly
% edited version of the output of citation().
\bibliography{/home/harrelfe/bib/feh.bib}
\bibliographystyle{unsrt}
% Use \bibliographystyle{abbrv} if want references alphabetized
\end{document}
Using SweaveListingUtils
| Output
This template assumes you have installed the R package
SweaveListingUtils
which allows you to greatly beautify how the R code, comments, and output are typeset. The LaTeX package
listings
is assumed to be installed on your system (it is on most). Note that there is a Linux package
rubber
you can install that automatically runs
latex
and
bibtex
as many times as needed. Run it using for example
rubber model
to compile
model.tex
. Use
rubber -d model
to run
pdflatex
in place of
latex
.
%Usage: R CMD Sweave template.Rnw
% Runs model.Rnw to produce template.tex and graphics files in graphics/
% latex or pdflatex template; bibtex template; latex or pdflatex template
% (leave out last two steps if there are no bibliographic citations,
% or automate with rubber -d template)
% To get .R file: Stangle template
\documentclass{article}
\usepackage{relsize,setspace} % used by latex(describe( ))
\usepackage{url} % used in bibliography
\usepackage[superscript,nomove]{cite} % use if \cite is used and superscripts wanted
% Remove nomove if you want superscripts after punctuation in citations
\usepackage{lscape} % for landscape mode tables
\textwidth 6.75in % set dimensions before fancyhdr
\textheight 9.25in
\topmargin -.875in
\oddsidemargin -.125in
\evensidemargin -.125in
\usepackage{fancyhdr} % this and next line are for fancy headers/footers
\pagestyle{fancy}
\newcommand{\bc}{\begin{center}} % abbreviate
\newcommand{\ec}{\end{center}}
% The next 10 lines are used if you are beautifying R code and output with SweaveListingUtils
\usepackage{listings}
\usepackage[nogin]{Sweave}
% Use nogin to respect height and width as specified below, otherwise all widths will be changed to 80% of the text width
\SweaveOpts{keep.source=TRUE}
<<<SweaveListingspreparations, results=tex, echo=FALSE>>=
require(SweaveListingUtils)
SweaveListingPreparations()
spar <- function(mar=c(3.25+bot-.45*multi,3.5+left,.5+top+.25*multi,.5+rt),
lwd = if(multi)1 else 1.75,
mgp = if(multi) c(1.5, .365, 0) else c(2, 0.475, 0),
tcl = if(multi)-0.25 else -0.4,
bot=0, left=0, top=0, rt=0, ps=14,
mfrow=NULL, ...)
{
multi <- length(mfrow) > 0
par(mar=mar, lwd=lwd, mgp=mgp, tcl=tcl, ps=ps, ...)
if(multi) par(mfrow=mfrow)
}
options(SweaveHooks=list(fig=spar)) # run spar() before every plot
options(prompt=' ',continue=' ') # remove prompt characters at start of lines
@
% To control colors, use something like the following:
% r <- function(x) col2rgb(x)/255
% SweaveListingPreparations(Rcolor=r('green'), Rcomment=r('red'), Rout=r('blue'))
% For b+w documents use Rcolor=r('black'),Rcomment=r(gray(.3)),Rout=r('black')
\title{An Analysis}
\author{Jane Doe\\\smaller Department of Biostatistics\\\smaller Vanderbilt University School of Medicine}
\begin{document}
% To produce both postscript and pdf graphics, remove the eps and pdf
% parameters in the next line. Set default plot size to 6x4 in.
\SweaveOpts{prefix.string=graphics/plot, eps = FALSE, pdf = TRUE}
\SweaveOpts{width=6, height=4}
%\setkeys{Gin}{width=0.85\textwidth} will undo width=6, height=4
\maketitle
% Use the following 3 lines for long reports needing navigation
\tableofcontents
%\listoftables
%\listoffigures % not used unless figure environments used
% results=tex below makes SweaveListingUtils highlight function names in
% Hmisc and Design
<<echo=F,results=tex>>=
options(Hverbose=FALSE) # Silently load Hmisc and Design
require(Design)
# The following line is only needed if the prselect function is needed.
# prselect will be added to the next version of Hmisc. It allows for
# selective deletion of R output in the report.
source('http://biostat.mc.vanderbilt.edu/cgi-bin/viewvc.cgi/*checkout*/Hmisc/trunk/R/Misc.s')
@
\section{Descriptive Statistics}
<<results=tex>>=
getHdata(support) # Use Hmisc/getHdata to get dataset from VU DataSets wiki
d <- subset(support, select=c(age,sex,race,edu,income,hospdead,slos,dzgroup,
meanbp,hrt))
latex(describe(d), file='')
@
Race is reduced to three levels (white, black, OTHER) because of low
frequencies in other levels (minimum relative frequency set to 0.05).
<<>>=
d <- upData(d,
race = combine.levels(race, minlev = 0.05))
@
\section{Redundancy Analysis and Variable Interrelationships}
\bc
% Note: giving a chunk name to each code chunk that produces a figure
% makes it easy to know which plots to send to a collaborator, and
% will not allow numbered orphan plots to be left when code chunks are
% inserted into the file. The default in Sweave is for plots to be
% numbered by the chunks producing them.
<<vc,fig=T>>=
v <- varclus(~., data=d)
plot(v)
redun(~age+sex+race+edu+income+dzgroup+meanbp+hrt, data=d)
# Alternative: redun(~., data=subset(d, select=-c(hospdead,slos)))
@
\ec
Note that the clustering of black with white is not interesting; this just means that these are mutually exclusive higher frequency categories, causing them to be negatively correlated.
\section{Logistic Regression Model}
Here we fit a tentative binary logistic regression model. The
coefficients are not very useful so they are not printed.
<<z,eval=FALSE,echo=T>>=
dd <- datadist(d); options(datadist='dd')
f <- lrm(hospdead ~ rcs(age,4) + sex + race + dzgroup + rcs(meanbp,5),
data=d)
f
<<echo=F>>=
z <- capture.output( {
<<z>>
} )
prselect(z, 'S.E.') # keep only summary stats; or:
# prselect(z, stop='S.E.', j=-1) # keep only coefficients
@
<<results=tex>>=
latex(anova(f), where='h', file='') # can also try where='htbp'
@
\section{Test Calculations}
\bc
<<testp,fig=T>>=
x <- 3; y <- 2
if(x <= y) 'this' else 'that'
if(y >= x) 'that' else 'this'
x^y
plot(runif(20),runif(20))
@
\ec
\section{Computing Environment}
These analyses were done using the following versions of R\cite{Rsystem}, the
operating system, and add-on packages \code{Hmisc}\cite{Hmisc},
\code{Design}\cite{Design}, and others:
<<echo=F,results=tex>>=
toLatex(sessionInfo(), locale=FALSE)
@
% Note: Rsystem reference is defined inside feh.bib. It is a slightly
% edited version of the output of citation().
\bibliography{/home/harrelfe/bib/feh.bib}
\bibliographystyle{unsrt}
% Use \bibliographystyle{abbrv} if want references alphabetized
\end{document}
If you have a master document that does not produce any R graphics, and a series of sections in separate
.Rnw
files, the master document can contain the setup up to but not including the definition of
spar
, and each separate
.Rnw
file to be
\input
from the master document should start with
<<echo=FALSE>>=
spar <- function(mar=c(3.25+bot-.45*multi,3.5+left,.5+top+.25*multi,.5+rt),
lwd = if(multi)1 else 1.75,
mgp = if(multi) c(1.5, .365, 0) else c(2.4-.4, 0.475, 0),
tcl = if(multi)-0.25 else -0.4,
bot=0, left=0, top=0, rt=0, ps=14,
mfrow=NULL, ...)
{
multi <- length(mfrow) > 0
par(mar=mar, lwd=lwd, mgp=mgp, tcl=tcl, ...)
if(multi) par(mfrow=mfrow)
}
options(SweaveHooks=list(fig=spar)) # run spar() before every plot
options(prompt=' ',continue=' ') # remove prompt characters at start of lines
@
\SweaveOpts{prefix.string=plot, eps = FALSE, pdf = TRUE, keep.source=TRUE}
\SweaveOpts{width=6, height=4}
You may have to have
require
or
library
commands in each section, as you run each section separately using e.g.
R CMD Sweave section.Rnw
.
Using LaTeX figure
Environments for Plots
If you want plots to float, have captions, or you want to reference figures symbolically in your report (e.g.,
See Figure \ref{myfig}
) you need to enclose the figures in a
figure
environment. You can do this in standard
Sweave
by having
\begin{figure}
and
\end{figure}
enclose the code chunk, but this will put the
R
code at the top of the figure. To have full control of the issue, use the following pattern. If you are using
Sweave
to make a presentation, you will want figure setup and closure (
dev.off
) commands to be suppressed from the final
pdf
file. This can be done by adding
#rm#
to any line you want to disappear, and running the
.tex
file created by
Sweave
through the
rmlines
shell script, e.g.,
rmlines my.tex
.
% Put the following in your master =.tex= or =.Rnw= file:
%\fg{basefilename}{label}{caption}
\newcommand{\fg}[3]{\begin{figure}[htbp]%
\leavevmode%
\centerline{\includegraphics{#1}}%
\caption{#3}%
\label{#2}%
\end{figure}}
%\fgh{basefilename}{label}{caption}{short caption for TOC}
\newcommand{\fgh}[4]{\begin{figure}[htbp]%
\leavevmode%
\centerline{\includegraphics{#1}}%
\caption[#4]{#3}%
\label{#2}%
\end{figure}}
% Put at the top of each =.Rnw= file:
<<echo=f>>=
ppdf <- function(file, w=4.5, h=3, ...) # set your own default height and width
{
pdf(paste(substitute(file),'pdf',sep='.'), width=w, height=h)
# use e.g. paste('pdf/',substitute(file),'.pdf',sep='') to put in subdirectory
spar(...)
}
doff <- function() invisible(dev.off()) # invisible to prevent R output
spar <- function(mar=c(3.25+bot-.45*multi,3.5+left,.5+top+.25*multi,.5+rt),
lwd = if(multi)1 else 1.75,
mgp = if(multi) c(1.5, .365, 0) else c(2.4-.4, 0.475, 0),
tcl = if(multi)-0.25 else -0.4,
bot=0, left=0, top=0, rt=0, ps=14,
mfrow=NULL, ...)
{
multi <- length(mfrow) > 0
par(mar=mar, lwd=lwd, mgp=mgp, tcl=tcl, ps=ps, ...)
if(multi) par(mfrow=mfrow)
}
# Default: par(mar=c(3.25,3.5,.5,.5))
options(SweaveHooks=list(fig=spar)) # run spar() before every plot
options(prompt=' ',continue=' ') # remove prompt characters at start of lines
@
# Make a plot. File name will be summary.pdf in current working directory
# Modify ppdf if you want to automatically put graphics in a subdirectory
<<>>=
ppdf(summary) #rm#
# Use e.g. ppdf(summary, h=4, w=5) to change size or ppdf(myplot, mfrow=c(1,2)) for multiple plots
plot(f) # Figure \ref{zz} [note zz can be a single word or more than one word separated by .]
doff() #rm#
@
# s2latx.pl called by Sweavev will automatically remove lines ending in doff() from the listing without needing #rm#
\fg{summary}{zz}{Univariable summaries}
See also
http://addictedtor.free.fr/misc/sweave for results of Romain Francois'
highlight
approach.