2014-09-06 56 views
2

R-3.1.1,Win7的X64,knitr版本1.6,xtable版本1.7-3R:在对角线COLUMNNAMES xtable

我试图建立与角度的列名的表,以下从讨论here想法。我的工作流程建立在knitr/Latex上,为了实现我的报告自动化,所以我想将这些想法融入到xtable中。我的代码如下:

\documentclass[a4paper,11pt]{article} 

\usepackage{graphicx} 
\usepackage[T1]{fontenc} 
\usepackage{tabularx} 
\usepackage{longtable} 
\usepackage{rotating} 
\usepackage{makecell} 
\renewcommand{\rothead}[2][60]{\makebox[9mm][c]{\rotatebox{#1}{\makecell[c]{#2}}}}% 


\begin{document} 

<<global_opts, echo=FALSE>>= 
opts_chunk$set(fig.keep='none', results='hide', echo=FALSE) 
@ 

<<tab01>>= 
require(xtable, quietly = TRUE) 
test <- matrix(95:110, ncol = 4) 
rownames(test) <- paste0("row ", 1:4) 
colnames(test) <- paste0("\\multicolumn{2}{c}{\\rotatebox{60}{column ", 1:4, "}}") 
tab10 <- xtable(test) 
tab10 <- print(tab10, sanitize.colnames.function = function(x){x}) 
@ 

{\Sexpr{tab10}} 
\end{document} 

这种有点完成工作,但并不像我希望的那么好。输出看起来像:

enter image description here

当然,我想列名彼此相邻,而不是彼此的顶部。 此外,我得到以下警告:

knit2pdf("diagonal_headers.Rnw") 

Warning message: 
running command '"C:\PROGRA~1\MIKTEX~1.9\miktex\bin\x64\texi2dvi.exe" --quiet --pdf  "tab_tests_diagonaal.tex" --max-iterations=20 -I "C:/PROGRA~1/R/R-31~1.1/share/texmf/tex/latex" -I "C:/PROGRA~1/R/R-31~1.1/share/texmf/bibtex/bst"' had status 1 

总体而言,我越来越接近。我能做些什么来修复表格布局?

+0

也许'multicolumn {1} {c} ...'而不是'multicolumn {2} {c} ...' – kohske 2014-09-07 15:56:51

+0

确实,这是不正确的。在你提到的链接中,两列合在一起,但在你的例子中并不是这样。 – 2014-09-07 17:12:37

回答

3

这是一种方法来完成它。序言没有改变,所以我只在这里显示代码块。

代码的准系统版本是:

<<tab01_barebones>>= 
require(xtable, quietly = TRUE) 
test <- matrix(95:110, ncol = 4) 
rownames(test) <- paste0("row ", 1:4) 
cols <- paste0("\\rothead{column ", 1:4, "}", collapse = " & ") 
cols <- paste0("\\rothead{} & ", cols, "\\\\") 
tab10 <- xtable(test) 
tab10 <- print(tab10, include.colnames = FALSE, add.to.row = list(pos = as.list(0), command = cols), sanitize.colnames.function = function(x) {x}, booktabs = FALSE, hline.after = NULL) 
@ 

这将产生:

enter image description here

有一对夫妇的问题与您的代码。实际上,您还需要在行名称上方的单元的代码,它基本上是标题列中其他单元的空白版本:\\multicolumn{1}{c}{\\rothead{}}。此外,\\multicolumn{2}必须是\\multicolumn{1},因为您实际上并未合并单元格。事实上,你可以完全废除\\multicolumn{1},只保留\\rothead

你会看到布局变得有点笨拙,有角标题的B/C。这里是使位漂亮的一种方法:

<<tab01>>= 
require(xtable, quietly = TRUE) 
test <- matrix(95:110, ncol = 4) 
rownames(test) <- paste0("row ", 1:4) 
cols <- paste0("\\multicolumn{1}{c}{\\rothead{column ", 1:4, "}}", collapse = " & ") 
cols <- paste0("\\multicolumn{1}{c}{\\rothead{}} & ", cols, "\\\\") 
tab10 <- xtable(test) 
align(tab10) <- "r|cccc|" 
tab10 <- print(tab10, include.colnames = FALSE, add.to.row = list(pos = as.list(c(0,0,4)),  command = c(cols, "\\cline{2-5}","\\cline{2-5}")), 
      sanitize.colnames.function = function(x) {x}, booktabs = FALSE, hline.after = NULL) 
@ 

我恢复\\multicolumn{1}这里因此,垂直线将不延伸到头部的细胞(B/C是难看,这些成角度的标头)。我还添加了cline,以产生部分水平线。结果表是:

enter image description here

也许是更好的使用align(tab10) <- "r|llll|"代替,虽然我不是左对齐的数字的大风扇:

enter image description here

HTH,彼得

+0

超级,谢谢。这很好。事实上,我必须考虑布局问题,但底部表格已经看起来对我很好。 这完美地完成了这项工作! – 2014-09-08 14:59:16