Форматирование таблиц Sweave, две проблемы

#formatting #sweave

#форматирование #sweave

Вопрос:

Я борюсь с двумя проблемами форматирования в Sweave. Одна из них — выделение текста в таблице курсивом, вторая — как добавить строку суммирования столбцов в нижнюю часть таблицы. Пожалуйста, смотрите Следующий MWE для получения подробной информации.

 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
          amp; taxa amp; sites \
        hline
        1 amp; emph{Arabidopsis thaliana}     amp; 270 \
        2 amp; emph{Populus trichocarpa}      amp; 320 \
        3 amp; emph{Brachypodium distachyon}  amp; 240 \    
        hline
          amp; Total Sites                     amp; 830 \
        hline
    end{tabular}   
end{table}
end{document}
  

Ответ №1:

Добавьте emph вручную с paste помощью и добавьте новую строку с rbind помощью, установив имя новой строки в один пробел. Кроме того, используйте stringsAsFactors=FALSE в создании исходного фрейма данных, чтобы сделать возможным добавление нового значения в столбец taxa.

Затем используйте sanitize.text.function=identity , чтобы xtable сохранить обратную косую черту в emph команде и hline.after получить строки там, где вы их хотите.

 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}
  

Комментарии:

1. Спасибо, Аарон. Я уже могу придумать ряд других приложений для этих методов. sanitize.text.function Аргумент to print.xtable был шагом, которого мне не хватало, чтобы заставить курсив работать, а stringsAsFactors=FALSE аргумент to data.frame — это то, что мне нужно, чтобы приступить rbind к работе.