]> git.donarmstrong.com Git - xtable.git/commitdiff
Added capability for producing lists
authordscott <dscott@edb9625f-4e0d-4859-8d74-9fd3b1da38cb>
Wed, 23 Dec 2015 07:04:20 +0000 (07:04 +0000)
committerdscott <dscott@edb9625f-4e0d-4859-8d74-9fd3b1da38cb>
Wed, 23 Dec 2015 07:04:20 +0000 (07:04 +0000)
git-svn-id: svn://scm.r-forge.r-project.org/svnroot/xtable@77 edb9625f-4e0d-4859-8d74-9fd3b1da38cb

pkg/DESCRIPTION
pkg/NAMESPACE
pkg/R/print.xtableList.R [new file with mode: 0644]
pkg/R/xtable.R
pkg/man/xtable-internal.Rd [new file with mode: 0644]
pkg/vignettes/listOfTablesGallery.Rnw [new file with mode: 0644]

index dca3e583c725287410239d0aa92a7ddeaba232ba..13199e942998a12d0f91e9d7143cfaa87e0cad28 100644 (file)
@@ -5,7 +5,7 @@ Title: Export Tables to LaTeX or HTML
 Author: David B. Dahl <dahl@stat.byu.edu>
 Maintainer: David Scott <d.scott@auckland.ac.nz>
 Imports: stats, utils
-Suggests: knitr
+Suggests: knitr, lsmeans
 VignetteBuilder: knitr
 Description: Coerce data to LaTeX and HTML tables.
 URL: http://xtable.r-forge.r-project.org/
index 46e21633af9c16afb8271a266870d08dc97ca181..92f5928c2bae2be1e22359a88465f6df8b30b30a 100644 (file)
@@ -3,13 +3,15 @@ importFrom("stats", "anova", "as.ts", "cycle", "end", "frequency",
            "na.omit", "pchisq", "start", "time")
 importFrom("utils", "packageDescription")
 export("caption<-", "caption", "label", "label<-",
-   "align<-", "align", "digits<-", "digits", "display<-",
-   "display", "xtable",
-   "print.xtable", "print.xtableMatharray","toLatex.xtable",
-   "autoformat", "xalign", "xdigits", "xdisplay")
+       "align<-", "align", "digits<-", "digits", "display<-",
+       "display", "xtable", "xtable.xtableList", "xtable.lsmeans",
+       "print.xtable", "print.xtableMatharray", "print.xtableList",
+       "toLatex.xtable",
+       "autoformat", "xalign", "xdigits", "xdisplay")
 
 S3method("print", "xtable")
 S3method("print", "xtableMatharray")
+S3method("print", "xtableList")
 S3method("toLatex", "xtable")
 
 S3method("caption<-", "xtable")
@@ -26,6 +28,7 @@ S3method("display", "xtable")
 S3method("xtable", "data.frame")
 S3method("xtable", "matrix")
 S3method("xtable", "xtableMatharray")
+S3method("xtable", "xtableList")
 S3method("xtable", "table")
 S3method("xtable", "anova")
 S3method("xtable", "aov")
@@ -41,3 +44,4 @@ S3method("xtable", "summary.prcomp")
 S3method("xtable", "coxph")
 S3method("xtable", "ts")
 S3method("xtable", "zoo")
+S3method("xtable", "lsmeans")
diff --git a/pkg/R/print.xtableList.R b/pkg/R/print.xtableList.R
new file mode 100644 (file)
index 0000000..30139c7
--- /dev/null
@@ -0,0 +1,146 @@
+print.xtableList <- function(x,\r
+  type = getOption("xtable.type", "latex"),\r
+  file = getOption("xtable.file", ""),\r
+  append = getOption("xtable.append", FALSE),\r
+  floating = getOption("xtable.floating", TRUE),\r
+  floating.environment = getOption("xtable.floating.environment", "table"),\r
+  table.placement = getOption("xtable.table.placement", "ht"),\r
+  caption.placement = getOption("xtable.caption.placement", "bottom"),\r
+  caption.width = getOption("xtable.caption.width", NULL),\r
+  latex.environments = getOption("xtable.latex.environments", c("center")),\r
+  tabular.environment = getOption("xtable.tabular.environment", "tabular"),\r
+  size = getOption("xtable.size", NULL),\r
+  hline.after = NULL,\r
+  NA.string = getOption("xtable.NA.string", ""),\r
+  include.rownames = getOption("xtable.include.rownames", TRUE),\r
+  include.colnames = getOption("xtable.include.colnames", TRUE),\r
+  only.contents = getOption("xtable.only.contents", FALSE),\r
+  add.to.row = NULL,\r
+  sanitize.text.function = getOption("xtable.sanitize.text.function", NULL),\r
+  sanitize.rownames.function = getOption("xtable.sanitize.rownames.function",\r
+                                         sanitize.text.function),\r
+  sanitize.colnames.function = getOption("xtable.sanitize.colnames.function",\r
+                                         sanitize.text.function),\r
+  math.style.negative = getOption("xtable.math.style.negative", FALSE),\r
+  html.table.attributes = getOption("xtable.html.table.attributes", "border=1"),\r
+  print.results = getOption("xtable.print.results", TRUE),\r
+  format.args = getOption("xtable.format.args", NULL),\r
+  rotate.rownames = getOption("xtable.rotate.rownames", FALSE),\r
+  rotate.colnames = getOption("xtable.rotate.colnames", FALSE),\r
+  booktabs = getOption("xtable.booktabs", FALSE),\r
+  scalebox = getOption("xtable.scalebox", NULL),\r
+  width = getOption("xtable.width", NULL),\r
+  comment = getOption("xtable.comment", TRUE),\r
+  timestamp = getOption("xtable.timestamp", date()),\r
+  colnames.format = "single",\r
+  ...)\r
+{\r
+  ## Get number of rows for each table in list of tables\r
+  if (booktabs){\r
+    tRule <- "\\toprule"\r
+    mRule <- "\\midrule"\r
+    bRule <- "\\bottomrule"\r
+  } else {\r
+    tRule <- "\\hline"\r
+    mRule <- "\\hline"\r
+    bRule <- "\\hline"\r
+  }\r
+  nCols <- dim(x[[1]])[2]\r
+  rowNums <- sapply(x, dim)[1,]\r
+  combinedRowNums <- cumsum(rowNums)\r
+  combined <- do.call(rbind, x)\r
+  if (colnames.format == "single"){\r
+    add.to.row <- list(pos = NULL, command = NULL)\r
+    add.to.row$pos <- as.list(c(0, combinedRowNums[-length(x)],\r
+                                dim(combined)[1]))\r
+    command <- sapply(x, attr, "subheading")\r
+\r
+    add.to.row$command[1:length(x)] <-\r
+      paste0(mRule,"\n\\multicolumn{", nCols, "}{l}{", command, "}\\\\\n")\r
+    if ( (booktabs) & length(attr(x, "message") > 0) ){\r
+      attr(x, "message")[1] <-\r
+        paste0("\\rule{0em}{2.5ex}", attr(x, "message")[1])\r
+    }\r
+    add.to.row$command[length(x) + 1] <-\r
+      paste0("\n\\multicolumn{", nCols, "}{l}{", attr(x, "message"), "}\\\\\n",\r
+             collapse = "")\r
+    add.to.row$command[length(x) + 1] <-\r
+      paste0(bRule, add.to.row$command[length(x) + 1])\r
+\r
+    class(combined) <- c("xtableList", "data.frame")\r
+    hline.after <- c(-1)\r
+    include.colnames <- TRUE\r
+  }\r
+\r
+  if (colnames.format == "multiple"){\r
+    if (is.null(sanitize.colnames.function)) {\r
+      colHead <- names(x[[1]])\r
+    } else {\r
+      colHead <- sanitize.colnames.function(names(x[[1]]))\r
+    }\r
+    if (rotate.colnames) {\r
+      colHead <- paste("\\begin{sideways}", colHead, "\\end{sideways}")\r
+    }\r
+    colHead <- paste0(colHead, collapse = " & ")\r
+    colHead <- paste0(tRule, "\n", colHead, " \\\\", mRule, "\n")\r
+    add.to.row <- list(pos = NULL, command = NULL)\r
+    add.to.row$pos <- as.list(c(0, c(combinedRowNums[1:length(x)])))\r
+    command <- sapply(x, attr, "subheading")\r
+    add.to.row$command[1] <-\r
+      paste0("\n\\multicolumn{", nCols, "}{l}{", command[1], "}", " \\\\ \n",\r
+             colHead)\r
+    add.to.row$command[2:length(x)] <-\r
+      paste0(bRule,\r
+             "\\\\ \n\\multicolumn{", nCols, "}{l}{",\r
+             command[2:length(x)], "}",\r
+             "\\\\ \n",\r
+             colHead)\r
+    if ( (booktabs) & length(attr(x, "message") > 0) ){\r
+      attr(x, "message")[1] <-\r
+        paste0("\\rule{0em}{2.5ex}", attr(x, "message")[1])\r
+    }\r
+    add.to.row$command[length(x) + 1] <-\r
+      paste0("\n\\multicolumn{", nCols, "}{l}{", attr(x, "message"), "}\\\\\n",\r
+             collapse = "")\r
+    add.to.row$command[length(x) + 1] <-\r
+      paste0(bRule, add.to.row$command[length(x) + 1])\r
+\r
+    class(combined) <- c("xtableList", "data.frame")\r
+    hline.after <- NULL\r
+\r
+    include.colnames <- FALSE\r
+  }\r
+\r
+  print.xtable(combined,\r
+               type = type,\r
+               floating = floating,\r
+               floating.environment = floating.environment,\r
+               table.placement = table.placement,\r
+               caption.placement = caption.placement,\r
+               caption.width = caption.width,\r
+               latex.environments = latex.environments,\r
+               tabular.environment = tabular.environment,\r
+               size = size,\r
+               hline.after = hline.after,\r
+               NA.string = NA.string,\r
+               include.rownames = include.rownames,\r
+               include.colnames = include.colnames,\r
+               only.contents = only.contents,\r
+               add.to.row = add.to.row,\r
+               sanitize.text.function = sanitize.text.function,\r
+               sanitize.rownames.function = sanitize.rownames.function,\r
+               sanitize.colnames.function = sanitize.colnames.function,\r
+               math.style.negative = math.style.negative,\r
+               html.table.attributes = html.table.attributes,\r
+               print.results = print.results,\r
+               format.args = format.args,\r
+               rotate.rownames = rotate.rownames,\r
+               rotate.colnames = rotate.colnames,\r
+               booktabs = booktabs,\r
+               scalebox = scalebox,\r
+               width = width,\r
+               comment = comment,\r
+               timestamp = timestamp,\r
+               ...)\r
+\r
+}\r
index e3c1e048b17788e61d70239c2739c8bd6d7becc7..396f6fe4ef4d3206a3b929ca2a55b15872078e68 100644 (file)
@@ -314,8 +314,64 @@ xtable.ts <- function(x, caption = NULL, label = NULL, align = NULL,
                 digits = digits, display = display, auto = auto))
 }
 
-# Suggested by Ajay Narottam Shah <ajayshah@mayin.org> in e-mail 2006/07/22
+### Suggested by Ajay Narottam Shah <ajayshah@mayin.org> in e-mail 2006/07/22
 xtable.zoo <- function(x, ...) {
   return(xtable(as.ts(x), ...))
 }
 
+### Function to create lists of tables
+xtable.xtableList <- function(x, caption = NULL, label = NULL, align = NULL,
+                              digits = NULL, display = NULL, ...) {
+  if (is.null(digits)){
+    digitsList <- vector("list", length(x))
+  } else {
+    if (!is.list(digits)){
+      digitsList <- vector("list", length(x))
+      for (i in 1:length(x)) digitsList[[i]] <- digits
+    }
+  }
+  if (is.null(display)){
+    displayList <- vector("list", length(x))
+  } else {
+    if (!is.list(display)){
+      displayList <- vector("list", length(x))
+      for (i in 1:length(x)) displayList[[i]] <- display
+    }
+  }
+  xList <- vector("list", length(x))
+  for (i in 1:length(x)){
+    xList[[i]] <- xtable(x[[i]], caption = caption, label = label,
+                         align = align, digits = digitsList[[i]],
+                         display = displayList[[i]], ...)
+    attr(xList[[i]], 'subheading') <- attr(x, 'subheadings')[[i]]
+  }
+  attr(xList, "message") <- attr(x, "message")
+  attr(xList, "caption") <- caption
+  attr(xList, "label") <- label
+  return(xList)
+}
+
+### Uses xtable.xtableList
+xtable.lsmeans <- function(x, caption = NULL, label = NULL,
+                           align = NULL, digits = NULL,
+                           display = NULL, auto = FALSE,
+                           ...){
+  if (attr(x, "estName") == "lsmean"){
+    xList <- split(x, f = x[, 2])
+    for (i in 1:length(xList)){
+      xList[[i]] <- as.data.frame(xList[[i]][, -2])
+    }
+    attr(xList, "subheadings") <-
+      paste0(dimnames(x)[[2]][2], " = ", levels(x[[2]]))
+    attr(xList, "message") <- c("", attr(x, "mesg"))
+    xList <- xtable.xtableList(xList, caption =caption, label = label,
+                           align = align, digits = digits,
+                           display = display, auto = auto, ...)
+  } else {
+    xList <- x
+    xList <- xtable.data.frame(xList, caption =caption, label = label,
+                           align = align, digits = digits,
+                           display = display, auto = auto, ...)
+  }
+  return(xList)
+}
diff --git a/pkg/man/xtable-internal.Rd b/pkg/man/xtable-internal.Rd
new file mode 100644 (file)
index 0000000..3d5198b
--- /dev/null
@@ -0,0 +1,14 @@
+\name{xtable-internal}\r
+\alias{xtable.xtableList}\r
+\alias{print.xtableList}\r
+\alias{xtable.lsmeans}\r
+\r
+\title{Internal xtable Functions}\r
+\description{\r
+  Internal functions for the package xtable\r
+}\r
+\details{\r
+  Functions which are either not intended to be called by the user or\r
+  are waiting to be documented.\r
+}\r
+\keyword{ internal }
\ No newline at end of file
diff --git a/pkg/vignettes/listOfTablesGallery.Rnw b/pkg/vignettes/listOfTablesGallery.Rnw
new file mode 100644 (file)
index 0000000..34fbd38
--- /dev/null
@@ -0,0 +1,220 @@
+%\VignetteIndexEntry{xtable List of Tables Gallery}\r
+%\VignetteDepends{xtable, lsmeans}\r
+%\VignetteKeywords{LaTeX, HTML, table}\r
+%\VignettePackage{xtable}\r
+% !Rnw weave = knitr\r
+% \VignetteEngine{knitr::knitr}\r
+%**************************************************************************\r
+\documentclass{article}\r
+\usepackage[a4paper,height=24cm]{geometry} % geometry first\r
+\usepackage{array}\r
+\usepackage{booktabs}\r
+\usepackage{longtable}\r
+\usepackage{parskip}\r
+\usepackage{rotating}\r
+\usepackage{tabularx}\r
+\usepackage{titlesec}\r
+\usepackage{hyperref} % hyperref last\r
+\titleformat\subsubsection{\bfseries\itshape}{}{0pt}{}\r
+\newcommand\p{\vspace{2ex}}\r
+\newcommand\code[1]{\texttt{#1}}\r
+\newcommand\pkg[1]{\textbf{#1}}\r
+\setcounter{tocdepth}{2}\r
+\begin{document}\r
+\r
+\title{The \code{xtableList} Gallery}\r
+\author{David J. Scott}\r
+\maketitle\r
+\r
+\tableofcontents\r
+\r
+\newpage\r
+\r
+\section{Introduction}\r
+This document represents a test of the functions in \pkg{xtable} which\r
+deal with lists of dataframes.\r
+\r
+<<set, include=FALSE>>=\r
+library(knitr)\r
+opts_chunk$set(fig.path='Figures/list', debug=TRUE, echo=TRUE)\r
+opts_chunk$set(out.width='0.9\\textwidth')\r
+@\r
+\r
+The first step is to load the package and set some options for this document.\r
+<<package, results='asis'>>=\r
+library(xtable)\r
+options(xtable.floating = FALSE)\r
+options(xtable.timestamp = "")\r
+options(width = 60)\r
+@\r
+\r
+\r
+Next we create a list of dataframes with attributes.\r
+\r
+<<data>>=\r
+require(xtable)\r
+data(mtcars)\r
+mtcars <- mtcars[, 1:6]\r
+mtcarsList <- split(mtcars, f = mtcars$cyl)\r
+### Reduce the size of the list elements\r
+mtcarsList[[1]] <- mtcarsList[[1]][1,]\r
+mtcarsList[[2]] <- mtcarsList[[2]][1:2,]\r
+mtcarsList[[3]] <- mtcarsList[[3]][1:3,]\r
+attr(mtcarsList, "subheadings") <- paste0("Number of cylinders = ",\r
+                                          names(mtcarsList))\r
+attr(mtcarsList, "message") <- c("Line 1 of Message",\r
+                                 "Line 2 of Message")\r
+str(mtcarsList)\r
+attributes(mtcarsList)\r
+@ %def\r
+\r
+Now create a list of \code{xtable} objects.\r
+\r
+\r
+<<xtablelist>>=\r
+xList <- xtable.xtableList(mtcarsList)\r
+str(xList)\r
+@ %def\r
+\r
+Create an alternative version where the lists have different values\r
+for \code{digits}.\r
+\r
+\r
+<<xtablelist1>>=\r
+xList1 <- xtable.xtableList(mtcarsList, digits = c(0,2,0,0,0,1,2))\r
+str(xList1)\r
+@ %def\r
+\r
+<<xtablelist2>>=\r
+xList2 <- xtable.xtableList(mtcarsList, digits = c(0,2,0,0,0,1,2),\r
+                            caption = "Caption to List",\r
+                            label = "tbl:xtableList")\r
+str(xList2)\r
+@ %def\r
+\r
+\newpage\r
+\r
+\section{Single Column Names}\r
+\label{sec:single-column-names}\r
+\r
+Print the list of \code{xtable} objects with a single header of the\r
+column names.\r
+\r
+First the default.\r
+\r
+\r
+<<singledefault, results='asis'>>=\r
+print.xtableList(xList)\r
+@ %def\r
+\r
+Booktabs should work.\r
+<<singlebooktabs, results='asis'>>=\r
+print.xtableList(xList, booktabs = TRUE)\r
+@ %def\r
+\r
+With digits being specified.\r
+<<singlebooktabs1, results='asis'>>=\r
+print.xtableList(xList1, booktabs = TRUE)\r
+@ %def\r
+\r
+Row and column names can be sanitized.\r
+\r
+<<sanitize>>=\r
+large <- function(x){\r
+  paste0('{\\Large{\\bfseries ', x, '}}')\r
+}\r
+italic <- function(x){\r
+  paste0('{\\emph{ ', x, '}}')\r
+}\r
+@ %def\r
+\r
+\r
+<<sanitizesingle, results='asis'>>=\r
+print.xtableList(xList,\r
+                 sanitize.rownames.function = italic,\r
+                 sanitize.colnames.function = large,\r
+                 booktabs = TRUE)\r
+@ %def\r
+\r
+A label and caption can be added.\r
+<<singlecaption, results='asis'>>=\r
+print.xtableList(xList2, floating = TRUE)\r
+@ %def\r
+\r
+Rotated column names?\r
+<<singlerotated, results='asis'>>=\r
+print.xtableList(xList, rotate.colnames = TRUE)\r
+@ %def\r
+\r
+\section{Multiple Column Names}\r
+\label{sec:multiple-column-names}\r
+\r
+Print the list of \code{xtable} objects with multiple headers of the\r
+column names.\r
+\r
+First the default with multiple column name headers.\r
+\r
+<<multipledefault, results='asis'>>=\r
+print.xtableList(xList, colnames.format = "multiple")\r
+@ %def\r
+\r
+Using booktabs:\r
+\r
+<<multiplebooktabs, results='asis'>>=\r
+print.xtableList(xList, colnames.format = "multiple",\r
+                 booktabs = TRUE)\r
+@ %def\r
+\r
+With sanitization.\r
+<<sanitizemultiple, results='asis'>>=\r
+print.xtableList(xList, colnames.format = "multiple",\r
+                 sanitize.rownames.function = italic,\r
+                 sanitize.colnames.function = large,\r
+                 booktabs = TRUE)\r
+@ %def\r
+\r
+A label and caption can be added.\r
+<<multiplecaption, results='asis'>>=\r
+print.xtableList(xList2, colnames.format = "multiple",\r
+                 floating = TRUE)\r
+@ %def\r
+\r
+Rotated column names?\r
+<<multiplerotated, results='asis'>>=\r
+print.xtableList(xList, colnames.format = "multiple",\r
+                 rotate.colnames = TRUE)\r
+@ %def\r
+\r
+\section{lsmeans}\r
+\label{sec:lsmeans}\r
+\r
+Summaries from the \code{lsmeans} function from the \pkg{lsmeans}\r
+package can easily be produced.\r
+\r
+\r
+<<lsmeans>>=\r
+library(lsmeans)\r
+warp.lm <- lm(breaks ~ wool*tension, data = warpbreaks)\r
+warp.lsm <- lsmeans(warp.lm, ~ tension | wool)\r
+warp.sum <- summary(warp.lsm, adjust = "mvt")\r
+warp.xtblList <- xtable.lsmeans(warp.sum, digits = c(0,0,2,2,0,2,2))\r
+str(warp.xtblList)\r
+@ %def\r
+\r
+<<lsmeansstr>>=\r
+print.xtableList(warp.xtblList, colnames.format = "multiple",\r
+                 include.rownames = FALSE)\r
+@ %def\r
+<<lsmeanstable, results='asis'>>=\r
+print.xtableList(warp.xtblList, colnames.format = "multiple",\r
+                 include.rownames = FALSE)\r
+@ %def\r
+\p\r
+<<lsmeansbooktabs, results='asis'>>=\r
+print.xtableList(warp.xtblList, colnames.format = "multiple",\r
+                 booktabs = TRUE,\r
+                 include.rownames = FALSE)\r
+@ %def\r
+\r
+\r
+\end{document}\r