我想使用align
的{{1}}参数来保持我设置的列的宽度,我想将所有数字列对齐到右边,其他数据列在左边,标题到中心
我找到了一些使用直接写在xtable
文件中的表的解决方案,但是我想从文件加载我的数据,因为我的表非常大,可以在创建knitr文档时更改。
代码(我在此示例中使用了rnw
数据集而不是我自己的数据):
iris
答案 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 }
中,它提供了居中的列名。
请注意,由于第一行中已更改的列类型,现在列名不再重叠(相反,表格太宽)。
答案 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}|")))