[我想保留使用align
的xtable
参数设置的列的宽度,我想将所有数字列向右对齐,其他数字列向左对齐,并且标题向中心对齐。
我发现了一些使用直接写在rnw
文件中的表的解决方案,但是我想从文件中加载数据,因为我的表很大,并且在创建Knitr文档时可以更改。
代码(在此示例中,我使用iris
数据集而不是我自己的数据):
<<table_symbionts_chunk, results="asis", echo=FALSE>>=
library(xtable)
irisX <-print (xtable (iris,
digits=rep(0,6),
align= c("p{0.015\\textwidth}|",
"p{0.37\\textwidth}|",
"p{0.12\\textwidth}|",
"p{0.08\\textwidth}|",
"p{0.02\\textwidth}|",
"p{0.35\\textwidth}|")))
@
这个问题的棘手部分是指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 }
中,该列提供居中的列名。
请注意,由于第一行中的列类型已更改,现在列名不再重叠(相反,表太宽了。)>
我遇到了同样的问题,并希望在R控制台中与您分享这件作品,