【问题标题】:How to set both column width and text alignment in align argument of xtable?如何在 xtable 的 align 参数中设置列宽和文本对齐方式?
【发布时间】:2016-01-17 11:12:51
【问题描述】:

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

我找到了一些使用直接写入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}|")))
        @

【问题讨论】:

  • 请查看this answer。它能回答你的问题吗?
  • 谢谢。我在这里问之前看过这个。如果我想将表格直接写入 .Rnw 文件,我想我可以使用。我不知道如何将它与通过代码块从文件导入的数据一起使用...

标签: r knitr xtable


【解决方案1】:

这个问题的棘手部分是关于 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} 中,提供居中的列名。

请注意,由于第一行中的列类型发生了变化,现在列名不再重叠(相反,表格太宽)。


此答案中的两个代码 sn-ps 产生以下输出:

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2011-06-24
      • 2013-12-04
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多