Search code examples
formattingsweave

Formatting Sweave Tables, two challenges


I'm struggling with two formatting challenges in Sweave. One is the italicization of text in the table, the second is how to add a column summation row to the bottom of a table. Please see the following MWE for details.

\documentclass[12pt,letterpaper,oneside]{amsart}
\usepackage{graphicx}
\usepackage{longtable}
\SweaveOpts{keep.source=TRUE}        % Keeps comments in the R code.
% 
\begin{document}
% \maketitle
\section*{The Challenge}
    Italicize the taxa in the following table and add a row at the bottom which gives the sum of the sites column.

<<echo=TRUE>>=
# Creating Data
taxa <- c("Arabidopsis thaliana",
    "Populus trichocarpa",
    "Brachypodium distachyon")
sites <- c(270,320,240)
data.df <- data.frame(taxa,sites)
@
~
<<label=tab1,echo=TRUE,results=tex>>=
# Creating Table
library(xtable)
data.table <- xtable(data.df,
    caption="Sweave Output")
print(data.table,
    caption.placement="top")
@

    The results should look something like table 2, which was hand coded in \LaTeX.
\begin{table}[ht]
    \caption{Manually coded \LaTeX}
    \begin{tabular}{l l r}
        \hline
          & taxa & sites \\
        \hline
        1 & \emph{Arabidopsis thaliana}     & 270 \\
        2 & \emph{Populus trichocarpa}      & 320 \\
        3 & \emph{Brachypodium distachyon}  & 240 \\    
        \hline
          & Total Sites                     & 830 \\
        \hline
    \end{tabular}   
\end{table}
\end{document}

Solution

  • Add the \emph manually with paste, and add the new row with rbind, setting the name of the new row to a single space. Also, use stringsAsFactors=FALSE in the original data frame creation to make adding a new value to the taxa column possible.

    Then use sanitize.text.function=identity to have xtable keep the backslashes in the \emph command, and hline.after to get the lines where you want them.

    \documentclass[12pt,letterpaper,oneside]{amsart}
    \usepackage{graphicx}
    \usepackage{longtable}
    \SweaveOpts{keep.source=TRUE}  % Keeps formatting of the R code.
    \begin{document}
    <<echo=TRUE>>=
    taxa <- c("Arabidopsis thaliana",
              "Populus trichocarpa",    
              "Brachypodium distachyon")
    sites <- c(270,320,240)
    data.df <- data.frame(taxa,sites, stringsAsFactors=FALSE)
    @
    ~
    <<label=tab2, echo=TRUE, results=tex>>=
    library(xtable)
    data.df$taxa <- paste("\\emph{",taxa,"}", sep="")
    data.df <- rbind(data.df, ` `=c("Total Sites", sum(data.df$sites)))
    data.table <- xtable(data.df,
                         caption="Sweave Output")
    print(data.table, 
          caption.placement="top", 
          sanitize.text.function=identity, 
          hline.after=c(-1,0,nrow(data.df)-1, nrow(data.df)))
    @
    \end{document}