% !Rnw weave = knitr\r
% \VignetteEngine{knitr::knitr}\r
%**************************************************************************\r
-\documentclass[article, nojss]{jss}\r
+\documentclass{article}\r
+\usepackage[a4paper,height=24cm]{geometry}\r
+\usepackage{parskip}\r
+\usepackage{titlesec}\r
+\titleformat\subsubsection{\bfseries\itshape}{}{0pt}{}\r
\usepackage{booktabs}\r
\usepackage{longtable}\r
\usepackage{rotating}\r
\usepackage{tabularx}\r
-\title{The xtable Gallery}\r
-\author{Jonathan Swinton and others\\<jonathan@swintons.net>}\r
-\Abstract{This document gives a gallery of tables which can be made by using the\r
- \texttt{xtable} package to create \LaTeX\ output. It doubles as a regression\r
- check for the package.}\r
-\Keywords{Reproducible research, \LaTeX}\r
-\Shorttitle{\pkg{xtable} Gallery} %% JSS header\r
-\Address{Jonathan Swinton\\E-mail: \email{jonathan@swintons.net}} %% JSS last pg\r
+\newcommand\code[1]{\texttt{#1}}\r
\newcommand\p{\vspace{2ex}}\r
+\setcounter{tocdepth}{2}\r
\begin{document}\r
\r
+\title{The xtable Gallery}\r
+\author{Jonathan Swinton and others}\r
+\maketitle\r
+\r
+\tableofcontents\r
+\r
+\newpage\r
+\r
<<include=FALSE>>=\r
library(knitr)\r
opts_chunk$set(fig.path='figdir/fig', debug=TRUE, echo=TRUE)\r
xtable(tli[1:10, ])\r
@\r
\r
-\newpage\r
-\r
\subsection{Matrix}\r
<<results='asis'>>=\r
design.matrix <- model.matrix(~ sex*grade, data = tli[1:10, ])\r
-xtable(design.matrix)\r
+xtable(design.matrix, digits = 0)\r
@\r
\r
\subsection{aov}\r
xtable(fm1)\r
@\r
\r
+\newpage\r
+\r
\subsection{lm}\r
<<results='asis'>>=\r
fm2 <- lm(tlimth ~ sex*ethnicty, data = tli)\r
xtable(fm2)\r
@\r
\r
-\p\textbf{\itshape Anova table (one model)}\r
+\subsubsection{Anova table (one model)}\r
<<results='asis'>>=\r
xtable(anova(fm2))\r
@\r
\r
-\p\textbf{\itshape Anova table (two models)}\r
+\subsubsection{Anova table (two models)}\r
<<results='asis'>>=\r
fm2b <- lm(tlimth ~ ethnicty, data = tli)\r
xtable(anova(fm2b, fm2))\r
xtable(fm3)\r
@\r
\r
-\p\textbf{\itshape Anova table}\r
+\p\r
<<results='asis'>>=\r
xtable(anova(fm3))\r
@\r
\r
-\subsection{More aov}\r
-<<results='asis'>>=\r
-## Venables and Ripley (1997, p. 210)\r
-N <- c(0,1,0,1,1,1,0,0,0,1,1,0,1,1,0,0,1,0,1,0,1,1,0,0)\r
-P <- c(1,1,0,0,0,1,0,1,1,1,0,0,0,1,0,1,1,0,0,1,0,1,1,0)\r
-K <- c(1,0,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,0,1,1,1,0,1,0)\r
-yield <- c(49.5,62.8,46.8,57.0,59.8,58.5,55.5,56.0,62.8,55.8,69.5,55.0,\r
- 62.0,48.8,45.5,44.2,52.0,51.5,49.8,48.8,57.2,59.0,53.2,56.0)\r
-npk <- data.frame(block = gl(6,4), N = factor(N), P = factor(P),\r
- K = factor(K), yield = yield)\r
-npk.aov <- aov(yield ~ block + N*P*K, npk)\r
-xtable(npk.aov)\r
-@\r
-\r
-\p\textbf{\itshape Anova table}\r
-<<results='asis'>>=\r
-xtable(anova(npk.aov))\r
-@\r
-\r
-\p\textbf{\itshape Summary table}\r
-<<results='asis'>>=\r
-xtable(summary(npk.aov))\r
-@\r
-\r
-<<results='asis'>>=\r
-## Alternative multistratum model\r
-op <- options(contrasts = c("contr.helmert", "contr.treatment"))\r
-npk.aovE <- aov(yield ~ N*P*K + Error(block), npk)\r
-options(op)\r
-xtable(npk.aovE)\r
-@\r
-\r
-<<results='asis'>>=\r
-xtable(summary(npk.aovE))\r
-@\r
-\r
-\subsection{More lm}\r
-<<results='asis'>>=\r
-## Dobson (1990, p. 9) plant weight data\r
-ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)\r
-trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)\r
-group <- gl(2,10,20, labels = c("Ctl","Trt"))\r
-weight <- c(ctl, trt)\r
-lm.D9 <- lm(weight ~ group)\r
-xtable(lm.D9)\r
-@\r
-\r
-<<results='asis'>>=\r
-xtable(anova(lm.D9))\r
-@\r
-\r
-\subsection{More glm}\r
-<<results='asis'>>=\r
-## Dobson (1990, p. 93) randomized controlled trial\r
-counts <- c(18,17,15,20,10,20,25,13,12)\r
-outcome <- gl(3,1,9)\r
-treatment <- gl(3,3)\r
-d.AD <- data.frame(treatment, outcome, counts)\r
-glm.D93 <- glm(counts ~ outcome + treatment, family = poisson)\r
-xtable(glm.D93, align = "r|llrc")\r
-@\r
-\r
\subsection{prcomp}\r
<<results='asis'>>=\r
pr1 <- prcomp(USArrests)\r
xtable(pr1)\r
@\r
\r
+\p\r
<<results='asis'>>=\r
xtable(summary(pr1))\r
@\r
temp.ts <- ts(cumsum(1 + round(rnorm(100), 0)),\r
start = c(1954, 7), frequency = 12)\r
temp.table <- xtable(temp.ts, digits = 0)\r
-caption(temp.table) <- "Time series example"\r
-print(temp.table, floating = TRUE)\r
+temp.table\r
@\r
\r
<<include=FALSE>>=\r
# }\r
@\r
\r
+\newpage\r
+\r
\section{Helper functions for formatting}\r
The functions \code{xalign}, \code{xdigits}, and \code{xdisplay} are useful for\r
formatting tables in a sensible way. Consider the output produced by the default\r
x\r
@\r
\r
+\newpage\r
+\r
\section{Sanitization}\r
<<results='asis'>>=\r
insane <- data.frame(Name = c("Ampersand","Greater than","Less than",\r
Sometimes you might want to have your own sanitization function.\r
\r
<<results='asis'>>=\r
-wanttex <- xtable(data.frame(label =\r
+wanttex <- xtable(data.frame(Column =\r
paste("Value_is $10^{-",1:3,"}$", sep = "")))\r
print(wanttex, sanitize.text.function =\r
function(str) gsub("_", "\\_", str, fixed = TRUE))\r
@\r
\r
+\newpage\r
+\r
\subsection{Markup in tables}\r
Markup can be included in tables, including in column and row names, by using\r
a custom \code{sanitize.text.function}.\r
<<results='asis'>>=\r
mat <- round(matrix(c(0.9, 0.89, 200, 0.045, 2.0), c(1, 5)), 4)\r
rownames(mat) <- "$y_{t-1}$"\r
-colnames(mat) <- c("$R^2$", "$\\bar{R}^2$", "F-stat", "S.E.E", "DW")\r
+colnames(mat) <- c("$R^2$", "$\\bar{x}$", "F-stat", "S.E.E", "DW")\r
mat <- xtable(mat)\r
print(mat, sanitize.text.function = function(x) {x})\r
@\r
\section{Format examples}\r
\subsection{Adding a centering environment}\r
<<results='asis'>>=\r
-print(xtable(lm.D9, caption = "\\tt latex.environments = NULL"),\r
- floating = TRUE, latex.environments = NULL)\r
-print(xtable(lm.D9, caption = "\\tt latex.environments = \"\""),\r
+print(xtable(money, caption = "\\tt latex.environments = \"\""),\r
floating = TRUE, latex.environments = "")\r
-print(xtable(lm.D9, caption = "\\tt latex.environments = \"center\""),\r
+print(xtable(money, caption = "\\tt latex.environments = \"center\""),\r
floating = TRUE, latex.environments = "center")\r
@\r
\r
+\newpage\r
+\r
\subsection{Column alignment}\r
<<results='asis'>>=\r
tli.table <- xtable(tli[1:10, ])\r
tli.table\r
@\r
\r
-\p\textbf{\itshape Left aligned strings with column lines}\r
+\subsubsection{Left aligned strings with column lines}\r
<<results='asis'>>=\r
align(tli.table) <- "|rrl|l|lr|"\r
tli.table\r
@\r
\r
-\p\textbf{\itshape Fixed width columns}\r
+\subsubsection{Fixed width columns}\r
<<results='asis'>>=\r
align(tli.table) <- "|rr|lp{3cm}l|r|"\r
tli.table\r
@\r
\r
+\newpage\r
+\r
\subsection{Number of digits}\r
One number for all columns,\r
<<results='asis'>>=\r
tli.table\r
@\r
\r
-\subsection{Suppress row names}\r
+\newpage\r
+\r
+\subsection{Suppress row/column names}\r
+\subsubsection{Suppress row names}\r
<<results='asis'>>=\r
tli.table <- xtable(tli[1:10, ])\r
print(tli.table, include.rownames = FALSE)\r
align(tli.table) <- "|rr|lp{3cm}l|r|"\r
@\r
\r
-\subsection{Suppress column names}\r
+\newpage\r
+\r
+\subsubsection{Suppress column names}\r
<<results='asis'>>=\r
print(tli.table, include.colnames = FALSE)\r
@\r
hline.after = c(0,nrow(tli.table)))\r
@\r
\r
-\subsection{Suppress row and column names}\r
+\subsubsection{Suppress row and column names}\r
<<results='asis'>>=\r
print(tli.table, include.colnames = FALSE, include.rownames = FALSE)\r
@\r
\r
-\subsection{Rotate row and column names}\r
+\newpage\r
+\r
+\subsection{Rotate row/column names}\r
The \code{rotate.rownames} and \code{rotate.colnames} arguments can be used to\r
rotate the row and/or column names. This requires \verb|\usepackage{rotating}|\r
in the \LaTeX\ preamble.\r
print(tli.table, rotate.rownames = TRUE, rotate.colnames = TRUE)\r
@\r
\r
-\subsection{Horizontal lines}\r
-\p\textbf{\itshape Line locations}\r
+\newpage\r
\r
+\subsection{Horizontal lines}\r
+\subsubsection{Line locations}\r
Use the \code{hline.after} argument to specify the position of the\r
horizontal lines.\r
\r
<<results='asis'>>=\r
-print(xtable(anova(glm.D93)), hline.after = c(1))\r
+print(xtable(anova(fm3)), hline.after = c(1))\r
@\r
\r
-\p\textbf{\itshape Line styles}\r
-\r
+\subsubsection{Line styles}\r
Specifying \code{booktabs = TRUE} will generate three line types. By default,\r
when no value is given for \code{hline.after}, a \verb|\toprule| will be drawn\r
above the table, a \verb|\midrule| after the table headings and a\r
print(bktbs, booktabs = TRUE, hline.after = hlines)\r
@\r
\r
-\subsection{Table-level LaTeX}\r
+\subsection{Table level commands}\r
<<results='asis'>>=\r
-print(xtable(anova(glm.D93)), size = "small")\r
+print(xtable(anova(fm3)), size = "large")\r
+@\r
+\r
+\p\r
+<<results='asis'>>=\r
+print(xtable(anova(fm3)), size = "\\setlength{\\tabcolsep}{12pt}")\r
@\r
\r
\subsection{Long tables}\r
%% The column name alignment is off in the following example.\r
%% It needs some revision before exposing it. - CR, 7/2/2012\r
%\r
-%\p\textbf{\itshape Long tables with the header on each page}\r
-%\r
+%\subsubsection{Long tables with the header on each page}\r
%The \code{add.to.row} argument can be used to display the header\r
%for a long table on each page, and to add a "continued" footer\r
%on all pages except the last page.\r
\r
<<results='asis'>>=\r
x <- x[1:30, ]\r
-x.small <- xtable(x, label = 'tabsmall', caption = 'A sideways table')\r
-print(x.small, floating = TRUE, floating.environment = 'sidewaystable')\r
+x.side <- xtable(x, caption = 'A sideways table')\r
+print(x.side, floating = TRUE, floating.environment = 'sidewaystable')\r
@\r
\clearpage\r
\r
print(x.width, tabular.environment = "tabularx", width = "\\textwidth")\r
@\r
\r
+\newpage\r
+\r
\section{Suppressing printing}\r
By default the \code{print} method will print the \LaTeX\ or HTML to standard\r
output and also return the character strings invisibly. The printing to\r