如何在xtable的align参数中设置列宽和文本对齐?

时间:2015-10-19 07:23:59

标签: r knitr xtable

我想使用align的{​​{1}}参数来保持我设置的列的宽度,我想将所有数字列对齐到右边,其他数据列在左边,标题到中心

我找到了一些使用直接写在xtable文件中的表的解决方案,但是我想从文件加载我的数据,因为我的表非常大,可以在创建knitr文档时更改。

代码(我在此示例中使用了rnw数据集而不是我自己的数据):

iris

2 个答案:

答案 0 :(得分:5)

这个问题的棘手部分是指LaTeX。请注意,我的TeX代码基于tex.stackexchange上的这两个问题:

问题的一部分很容易回答:如何设置固定的列宽但是将所有数字列对齐,还是将所有其他列对齐?

这只是正确列类型的问题(参见上面链接的答案)。解决方案可能是:

\documentclass{article}

\usepackage{array}
\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}p{#1}}

\begin{document}
<<table_symbionts_chunk, results="asis", echo=FALSE>>=
library(xtable)

irisShort <- head(iris)
print(xtable(irisShort,
             digits=rep(0,6),
             align=c(
               "p{0.015\\textwidth}|",
               "R{0.37\\textwidth}|",
               "R{0.12\\textwidth}|",
               "R{0.08\\textwidth}|",
               "R{0.02\\textwidth}|",
               "p{0.35\\textwidth}|")))
@
\end{document}

默认情况下,由于p{}列左对齐,我们只需要为具有固定宽度的右对齐列定义一个新列类型:R

请注意,列名重叠,但这是由于问题中指定的宽度。

使列名称居中只需要第一行的不同理由。这可以使用\multicolumn命令来实现。但是,由于我们要将LaTeX代码添加到列名称中,我们还必须阻止xtable使用sanitize.colnames.function = identity清理列名:

irisShort2 <- irisShort
colnames(irisShort2) <- paste("\\multicolumn{1}{c|}{", colnames(irisShort2), "}")

print(xtable(irisShort2,
             digits=rep(0,6),
             align=c(
               "p{0.015\\textwidth}|",
               "R{0.37\\textwidth}|",
               "R{0.12\\textwidth}|",
               "R{0.08\\textwidth}|",
               "R{0.02\\textwidth}|",
               "p{0.35\\textwidth}|")),
      sanitize.colnames.function = identity)

paste("\\multicolumn{1}{c|}{", colnames(irisShort2), "}")使用原始列名,但将其包含在\multicolumn{1}{c|}{ colname }中,它提供了居中的列名。

请注意,由于第一行中已更改的列类型,现在列名不再重叠(相反,表格太宽)。

此答案中的两个代码段产生以下输出: enter image description here

答案 1 :(得分:0)

我遇到了同样的问题,并希望在R控制台中与大家分享这个作品

library(xtable)

irisShort <- head(iris)
print(xtable(irisShort,
             digits=rep(0,6),
             align=c(
               "p{1cm}|","p{3cm}|",
               "p{2cm}|","p{3cm}|",
               "p{3cm}|","p{3cm}|")))