2012-08-02 15 views
12

Mi piacerebbe personalizzare xtable per l'esportazione in LaTeX. So che ci sono alcune domande su xtable qui, ma non sono riuscito a trovare le cose specifiche che sto cercando.Personalizza xtable

Ecco un esempio di come la mia tabella potrebbe essere simile:

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] <- "" 

che crea:

  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 

In realtà, questa tabella è importata da un file .csv-file come data.frame con my.table <- read.delim("filename.csv", sep=",", header=TRUE)

Ora creo un tavolo LaTeX con 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) 

Ecco il codice LaTeX risultante:

\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} 

Ok, e ora questo è quello che mi piacerebbe cambiare:

1) Inserire \midrule dopo la seconda fila invece dopo la prima . 2) Colori alternati delle righe di questa tabella inserendo \rowcolors{2}{gray!25}{white} all'interno dell'ambiente (o normale table). 3) Ruotare i nomi delle colonne di 45 ° 4) Inserire \centering invece di center -ambiente nei casi in cui voglio centrare la tabella.

Qualche idea su come ottenere questo risultato?

+2

(1) può essere fatto manualmente con 'add.to.row'. Gli altri penso che potrebbe essere necessario utilizzare un altro strumento per. 'latex' in ** Hmisc ** è solitamente più flessibile di' xtable'. – joran

risposta

11

avete bisogno di qualche pre-processing, argomento extra passato a print.xtable e alcuni post-processing:

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") 

Se avete bisogno di altro ambiente schede di tabular si può 1) aggiungere una nuova variabile:

TABULAR = "tabular" 

2) superare il suo valore a print.xtable in questo modo:

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

3) Modificare la post-elaborazione per i colori alternati:

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

Risultato:

enter image description here

+1

Non è necessario sostituire esplicitamente l'ambiente 'center'. Ho sollevato il supporto per il comando '\ centering' come un problema (# 2104) ed è stato risolto da David Scott alcuni mesi fa. – Alastair

+0

Ciao @redmode, potresti aggiungere una soluzione xtable a questa domanda https://stackoverflow.com/questions/43098950/how-to-rotate-a-table-left-margin-name-with-knitr-and-xtable ? – skan