16
votes

I want to put a comment under a table printed out by xtable. I figured that the best option would be to use the "caption" option: xtable(tablename, caption="This is a caption"). But this is somehow putting in a "Table 1" automatically, so that the output looks like:

Table 1: This is a caption.

Is there any way to suppress this or any simpler way of putting in a comment simply as an additional last row in the table?

3
xtable outputs code (LaTeX or html), so you must mean that LaTeX is putting 'Table 1:' in front of you caption text. This is normal LaTeX behavior; I suggest looking there for a solution.joran
Try searching for "suppress caption label" at tex.stackexchange.comjoran
This thread should be of some help to you: tex.stackexchange.com/questions/15282/…Paolo
This question doesn't seem to be getting any more answers, has any one of those below solved your issue? If so, you can select it as accepted, which will improve your reputation on SO.Waldir Leoncio

3 Answers

15
votes

First, some mock data:

x <- sample(LETTERS, 5, replace = TRUE)
y <- sample(LETTERS, 5, replace = TRUE)
z <- table(x, y)

Now here's a somewhat clumsy solution, using print.xtable's add.to.row argument.

comment          <- list()
comment$pos      <- list()
comment$pos[[1]] <- c(nrow(z))
comment$command  <- c(paste("\\hline \n",  # we`ll replace all default hlines with this and the ones below
                            "your footnote, caption or whatever.  \n",
                            sep = ""))
print(xtable(z),
      add.to.row = comment,
      hline.after = c(-1, 0))  # indicates rows that will contain hlines (the last one was defined up there)

If you want your comment to be placed before the data, use comment$pos[[1]] <- c(0) instead of comment$pos[[1]] <- c(nrow(z)) and adjust hline.after accordingly.

Here's my output:

% latex table generated in R 2.14.1 by xtable 1.7-0 package
% Mon Feb 20 02:17:58 2012
\begin{table}[ht]
\begin{center}
\begin{tabular}{rrrrr}
\hline
& B & C & P & V \\ 
\hline
A &   0 &   0 &   0 &   1 \\ 
D &   1 &   0 &   0 &   0 \\ 
I &   0 &   0 &   0 &   1 \\ 
P &   0 &   0 &   1 &   0 \\ 
Z &   0 &   1 &   0 &   0 \\ 
\hline
your footnote, caption or whatever.  
\end{tabular}
\end{center}
\end{table}
3
votes

This is basically repurposing this answer, but this is the most programmatic way to do this with xtable. It's ugly, mainly because I hate the way xtable's add.to.row argument works.

Sample data:

set.seed(230)
DF <- data.frame(a = rnorm(5), b = rnorm(5), c = rnorm(5))

#of course, we can pass this directly below; I'm just saving
#  horizontal space for this answer
comm <- paste0("\\hline \n \\multicolumn{4}{l}",
           "{\\scriptsize{Check out these random numbers!}} \n")

print.xtable(xtable(DF, caption = "Describe the table"),
             #adjusting hline.after so that our comment appears
             #  "outside" the table, as defined by its border
             hline.after=c(-1, 0),
             #**NOTE: the first argument to add.to.row must be
             #  a list -- don't ask me why since it strikes me as odd**
             add.to.row = list(pos = list(5),
                               command = comm))

Here's the TeX output:

% latex table generated in R 3.2.4 by xtable 1.8-2 package
% Mon May 23 18:25:14 2016
\begin{table}[ht]
\centering
\begin{tabular}{rrrr}
  \hline
 & a & b & c \\ 
  \hline
1 & -0.23 & 0.04 & 1.34 \\ 
  2 & 0.10 & 0.57 & -1.62 \\ 
  3 & 0.33 & -0.14 & 0.83 \\ 
  4 & 0.36 & -0.75 & 0.20 \\ 
  5 & 0.44 & 0.13 & -0.49 \\ 
   \hline 
 \multicolumn{4}{l}{\scriptsize{Check out these random numbers!}} 
\end{tabular}
\caption{Describe the table} 
\end{table}

And the .pdf result if I wrap it with \documentclass{article}, \begin{document}, and \end{document}:

enter image description here

Of course, there are much more bells and whistles to add to get it publication-ready, but this is the crux and you should be well on your way.

3
votes

If you are using RMarkdown, add this to the header:

---
(other configs here, like title, author, etc.)

header-includes:
    - \usepackage{caption}
    - \captionsetup{labelformat=empty}
---

Edit:

After talking with xtable package maintainer, David (that was very accessible), he came with this solution I post below:

I think this can be solved with xtableList. Create some data and convert the data frame to xtableList.

set.seed(230)
DF <- data.frame(a = rnorm(5), b = rnorm(5), c = rnorm(5))
library(xtable)
dfList <- list(DF)
attr(dfList, "message") <- c("A caption", "Which can have multiple lines")

Then xtable produces the following:

print(xtableList(dfList))
## % latex table generated in R 3.2.5 by xtable 1.8-3 package
## % Sat Jul 09 21:52:53 2016
## \begin{table}[ht]
## \centering
## \begin{tabular}{rrrr}
## \hline
## & a & b & c \\
## \hline
## 1 & -0.23 & 0.04 & 1.34 \\
## 2 & 0.10 & 0.57 & -1.62 \\
## 3 & 0.33 & -0.14 & 0.83 \\
## 4 & 0.36 & -0.75 & 0.20 \\
## 5 & 0.44 & 0.13 & -0.49 \\
## \hline
## \multicolumn{4}{l}{A caption}\\
##
## \multicolumn{4}{l}{Which can have multiple lines}\\
## \end{tabular}
## \end{table}

To deal with long captions you will need to split lines:

attr(dfList, "message") <- c("A caption", "Which can have", "multiple lines")