使用 knitr kable 函数对齐列

Posted

技术标签:

【中文标题】使用 knitr kable 函数对齐列【英文标题】:Aligning Columns with knitr kable function 【发布时间】:2017-05-12 22:34:28 【问题描述】:

我正在执行一个简单的任务:创建一个表并使用R Markdown 将其输出到pdf,如下所示:

library(knitr)
kable(datatable,align='ccccccc',
col.names = c("Copy","Sigma Est","Sigma Lower","Sigma Upper", 
"Lambda Est","Lambda Lower","Lambda Upper"),digits=3)

问题

当我输出表格时,列没有居中。实际上,对于某些表格,它们与其他表格右对齐 - 左对齐,这对我来说似乎相当随机。

问题

如何使用包knitr 中的R 函数kable 控制列的对齐方式,即,我做错了什么?

编辑

跑步:

library(knitr)
kable(datatable,align=c(rep('c',times=7)),
col.names = c("Copy","Sigma Est","Sigma Lower","Sigma Upper", 
"Lambda Est","Lambda Lower","Lambda Upper"),digits=3)

产量:

| Copy | Sigma Est | Sigma Lower | Sigma Upper | Lambda Est | Lambda Lower | Lambda Upper |
|:----:|:---------:|:-----------:|:-----------:|:----------:|:------------:|:------------:|
|  0   |  14.631   |   12.275    |   16.987    |   0.129    |    8.778     |    9.296     |
|  1   |  16.988   |   14.275    |   19.700    |   0.136    |    8.190     |    8.736     |
|  2   |  20.850   |   17.517    |   24.183    |   0.129    |    8.595     |    9.113     |
|  3   |  20.551   |   17.229    |   23.874    |   0.127    |    9.015     |    9.523     |
|  4   |  22.651   |   18.993    |   26.310    |   0.127    |    8.969     |    9.478     |
|  5   |  23.369   |   19.652    |   27.086    |   0.127    |    8.599     |    9.108     |

这正是我想要的,因为:---: 表示列居中,但是,当我按下Knit PDF 并生成pdf 文档时,所有列仍然是左对齐的。我该如何解决?

【问题讨论】:

【参考方案1】:

您想为kable 提供与列数相等的对齐字符串向量。如帮助文件中所述,

列的对齐方式:由“l”(左)、“c”(中)和/或“r”(右)组成的字符向量;默认情况下,数值列右对齐,其他列左对齐;如果 align = NULL,则使用默认对齐方式。

这是一个可重现的例子。

没有任何对齐值,字符列左对齐,数字列右对齐,如下所示。

library(knitr)

kable(head(mtcars[1:5]))

返回

|                  |  mpg| cyl| disp|  hp| drat|
|:-----------------|----:|---:|----:|---:|----:|
|Mazda RX4         | 21.0|   6|  160| 110| 3.90|
|Mazda RX4 Wag     | 21.0|   6|  160| 110| 3.90|
|Datsun 710        | 22.8|   4|  108|  93| 3.85|
|Hornet 4 Drive    | 21.4|   6|  258| 110| 3.08|
|Hornet Sportabout | 18.7|   8|  360| 175| 3.15|
|Valiant           | 18.1|   6|  225| 105| 2.76|

为了使数字列居中对齐,同时保持字符列右对齐,我使用了以下内容。

kable(head(mtcars[1:5]), align=rep('c', 5))


|                  | mpg  | cyl | disp | hp  | drat |
|:-----------------|:----:|:---:|:----:|:---:|:----:|
|Mazda RX4         | 21.0 |  6  | 160  | 110 | 3.90 |
|Mazda RX4 Wag     | 21.0 |  6  | 160  | 110 | 3.90 |
|Datsun 710        | 22.8 |  4  | 108  | 93  | 3.85 |
|Hornet 4 Drive    | 21.4 |  6  | 258  | 110 | 3.08 |
|Hornet Sportabout | 18.7 |  8  | 360  | 175 | 3.15 |
|Valiant           | 18.1 |  6  | 225  | 105 | 2.76 |

如果将以下文本复制到 .Rmd 文件中,将返回表格,并根据需要格式化为 pdf 文件。

---
title: "Untitled"
output: pdf_document
---

this thing

```r table1, as.is=TRUE
library(knitr)

kable(head(mtcars[1:5]))

```


is not a centered table, while this thing

```r table2, as.is=TRUE

kable(head(mtcars[1:5]), align=rep('c', 5))

```

is a centered table.

【讨论】:

感谢您的回答,这解决了其中一个问题,我编辑了原始帖子以反映第二个问题。 我必须添加format="markdown" 才能解决后一个问题。 谢谢。这正是我所需要的。【参考方案2】:

更简单:kable(mtcars, align = "l") 工作得很好!

【讨论】:

不知道这个arg是不是kable的新增,但是这个答案需要更高!【参考方案3】:

您还可以使用长度函数为向量/数据帧中的所有行创建向量,而无需对长度进行硬编码。下面的示例将 mtcars 数据框中的所有列左对齐,无论长度如何。

 kable(mtcars, align=rep('l', length(mtcars[,1])))

【讨论】:

以上是关于使用 knitr kable 函数对齐列的主要内容,如果未能解决你的问题,请参考以下文章

r:在 Flexdashboard 中使用 Shiny 渲染 Kable

R- knitr:kable - 如何显示没有列名的表格?

如何在带有`knitr::kable`的表格*上方添加标题?

使用 knitr 和 kable() 生成的表格控制零值的科学记数法和格式

使用 kable() 格式化带有嵌套列的表

从函数返回 print xtable 包括转义字符 knitr r