如何在 xtable 的对齐参数中同时设置列宽和文本对齐方式?

How to set both column width and text alignment in align argument of xtable?

我想保留使用 xtablealign 参数设置的列宽,我想将所有数字列右对齐,其他列左对齐,headers到中心。

我找到了一些使用 tables 的解决方案,它们直接写在 rnw 文件中,但我想从文件中加载数据,因为我的 table 很大并且可以更改在创建 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} 中,后者提供了居中的列名称。

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


此答案中的两个代码片段产生以下输出:

我遇到了同样的问题,想在 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}|")))