2012-08-02 37 views
12

我想定製xtable導出到LaTeX。我知道這裏有一些問題,但我找不到具體的東西。自定義xtable

這裏是我的表可能看起來怎麼樣一個例子:

my.table <- data.frame(Specifiers=c("","Spec1", "Spec2", "Spec3"), 
    Values1 = c("N=10", 1.03, 1.71, 2.25), 
    Values2 = c("N=20", 1.32, 1.79, 2.43)) 
colnames(my.table)[1] <- "" 

它創建:

  Values1 Values2 
1   N=10 N=20 
2 Spec1 1.03 1.32 
3 Spec2 1.71 1.79 
4 Spec3 2.25 2.43 

事實上,該表從.csv文件導入爲data.framemy.table <- read.delim("filename.csv", sep=",", header=TRUE)

現在我創建一個乳膠表xtable

latex.tab <- xtable(my.table, caption=c("Stats")) 
print(latex.tab, file="Summarystats.tex", 
    floating.environment='sidewaystable', 
    include.rownames=FALSE, 
    booktabs=TRUE, 
    latex.environment=NULL) 

這裏所得的膠乳代碼:

\begin{sidewaystable}[ht] 
\begin{tabular}{lllllll} 
    \toprule 
& Values1 & Values2 \\ 
    \midrule 
       N=10 & N=20 \\ 
    Spec1 & 1.03 & 1.32 \\ 
    Spec2 & 1.71 & 1.79 \\ 
    Spec3 & 2.25 & 2.43 \\ 

    \bottomrule 
\end{tabular} 
\end{sidewaystable} 

好了,現在這是我想改變什麼:

1)將\midrule第二行之後,而不是之後的第一個。 2)通過在sidewaystable(或正常的table)環境中插入\rowcolors{2}{gray!25}{white}來交替顯示該表的行的顏色。 3)將列名旋轉45° 4)插入\centering而不是center-環境中的情況下,我想中心表的情況下。

有關如何實現此目的的任何想法?

+2

(1)可以手動使用'add.to.row'來完成。其他人,我認爲你可能需要使用另一種工具。 ** Hmisc **中的'latex'通常比'xtable'更靈活。 – joran 2012-08-02 14:44:34

回答

11

你需要一些預處理,額外的參數傳遞給print.xtable和一些後期處理:

my.table <- data.frame(Specifiers=c("","Spec1", "Spec2", "Spec3"), 
         Values1 = c("N=10", 1.03, 1.71, 2.25), 
         Values2 = c("N=20", 1.32, 1.79, 2.43)) 
colnames(my.table)[1] <- "" 

# Pre-processing: rotates column names by 45 degrees 
head = apply(as.array(names(my.table)), 1, function(x) paste("\\rotatebox{45}{", x, "}")) 
head = paste(head, c(rep("&", length(head)-1), "\\\\\n"), collapse="") 

latex.tab <- xtable(my.table, caption=c("Stats")) 
ltable = print(latex.tab, file="", # File is empty, post-processing needed 
     floating.environment='sidewaystable', 
     include.rownames=FALSE, 
     include.colnames=FALSE, # No colnames 
     booktabs=TRUE, 
     latex.environment="center", # Or NULL 
     # Adds some extra-text after the rows specified in pos. 
     # Adds new \midrule and comments old one. 
     # Adds pre-processed names of columns 
     add.to.row=list(pos=as.list(c(0, 0, 1)), command=as.vector(c(head, "%", "\\midrule\n")))) 

# Post-processing: replaces \begin{center} with \centering 
ltable = sub("\\begin{center}\n", "\\centering\n", ltable, fixed=TRUE) 
ltable = sub("\\end{center}\n", "\n", ltable, fixed=TRUE) 

# Post-processing: adds alternating colours 
ltable = sub("\\begin{tabular}", 
      "\\rowcolors{2}{gray!25}{white}\n\\begin{tabular}", 
      ltable, fixed=TRUE) 

# Writes output to the file 
cat(ltable, file="Summarystats.tex") 

如果需要其他選項卡的環境比tabular可以 1)添加新的變量:

TABULAR = "tabular" 

2)傳遞它的價值print.xtable這樣的:

... 
tabular.environment=TABULAR, 
... 

3)更改後處理爲交替的顏色:

ltable = sub(sprintf("\\begin{%s}", TABULAR), 
      sprintf("\\rowcolors{2}{gray!25}{white}\n\\begin{%s}", TABULAR), 
      ltable, fixed=TRUE) 

結果:

enter image description here

+1

你不需要明確地替代'center'環境。我提出了對'\ centering'命令的支持(#2104),並在幾個月前由David Scott修復了。 – Alastair 2012-11-27 12:03:31

+0

你好@redmode,你可以請添加一個xtable解決方案到這個問題https://stackoverflow.com/questions/43098950/how-to-rotate-a-table-left-margin-name-with-knitr-and-xtable ? – skan 2017-04-05 10:46:59