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

问题描述 投票:1回答:2

[我想保留使用alignxtable参数设置的列的宽度,我想将所有数字列向右对齐,其他数字列向左对齐,并且标题向中心对齐。

我发现了一些使用直接写在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}|")))
        @
r knitr xtable
2个回答
6
投票

这个问题的棘手部分是指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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.