2012-08-02 14 views
12

Me gustaría personalizar xtable para exportar a LaTeX. Sé que hay algunas preguntas abot xtable aquí, pero no pude encontrar las cosas específicas que estoy buscando.Personalizar xtable

Aquí es un ejemplo de cómo mi mesa podría ser:

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

que 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 

De hecho, esta tabla ha sido importada desde una CSV-archivo como data.frame con my.table <- read.delim("filename.csv", sep=",", header=TRUE)

Ahora creo una tabla 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) 

Aquí es el código de látex resultante:

\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, y ahora esto es lo que me gustaría cambiar:

1) Inserte \midrule después de la segunda fila en lugar de después de la primera . 2) Alternando colores de las filas de esta tabla insertando \rowcolors{2}{gray!25}{white} dentro del entorno sidewaystable (o normal table). 3) Rotar nombres de columna por 45 ° 4) Insertar \centering en lugar del center -ambiente en los casos en que quiero centrar la tabla.

¿Alguna idea sobre cómo lograr esto?

+2

(1) se puede hacer manualmente usando 'add.to.row'. Los otros creo que puede necesitar usar otra herramienta para. 'latex' en ** Hmisc ** suele ser más flexible que' xtable'. – joran

Respuesta

11

usted necesita un poco de pre-procesamiento, argumento extra pasó a print.xtable y un post-procedimiento:

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

Si necesita otro entorno pestañas de tabular se puede 1) añadir nueva variable:

TABULAR = "tabular" 

2) Pase su valor a print.xtable así:

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

3) Cambiar el post-procesamiento para la alternancia de colores:

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

Resultado:

enter image description here

+1

Ya no debería necesitar sustituir explícitamente el entorno 'center'. Levanté el soporte para el comando '\ centering' como un problema (# 2104) y fue arreglado por David Scott hace unos meses. – Alastair

+0

Hola @redmode, podría agregar una solución xtable a esta pregunta https://stackoverflow.com/questions/43098950/how-to-rotate-a-table-left-margin-name-with-knitr-and-xtable ? – skan