2.5 表格
目前来说,生成一个表格的最方便的方法是使用函数 knitr::kable(),因为在 knitr 中有一些内部技巧可以使其与 bookdown 一起工作,并且用户并不需要知道这些实现细节。我们在本节后面将会解释如何使用其他软件包和函数。
和图片一样,带有标题的表格也将被编号并且可以被引用。kable() 函数将会为表格环境自动生成一个标签,即前缀 tab: 加上区块标签。例如,标签为 foo 的代码块的表格标签将是 tab:foo,并且我们仍然能够使用语法 \@ref(label) 来引用该表格。表 2.2 是一个简单的例子。
| mpg | cyl | disp | hp | drat | wt | qsec | vs | |
|---|---|---|---|---|---|---|---|---|
| Mazda RX4 | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.620 | 16.46 | 0 | 
| Mazda RX4 Wag | 21.0 | 6 | 160.0 | 110 | 3.90 | 2.875 | 17.02 | 0 | 
| Datsun 710 | 22.8 | 4 | 108.0 | 93 | 3.85 | 2.320 | 18.61 | 1 | 
| Hornet 4 Drive | 21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 
| Hornet Sportabout | 18.7 | 8 | 360.0 | 175 | 3.15 | 3.440 | 17.02 | 0 | 
| Valiant | 18.1 | 6 | 225.0 | 105 | 2.76 | 3.460 | 20.22 | 1 | 
| Duster 360 | 14.3 | 8 | 360.0 | 245 | 3.21 | 3.570 | 15.84 | 0 | 
| Merc 240D | 24.4 | 4 | 146.7 | 62 | 3.69 | 3.190 | 20.00 | 1 | 
| Merc 230 | 22.8 | 4 | 140.8 | 95 | 3.92 | 3.150 | 22.90 | 1 | 
| Merc 280 | 19.2 | 6 | 167.6 | 123 | 3.92 | 3.440 | 18.30 | 1 | 
如果要在单个表格环境放入多个表格,请将数据对象(通常是 R 中的数据框)封装到一个列表中有关示例请见表 2.3。请注意此功能仅在 HTML 和 PDF 输出格式中起作用。
knitr::kable(
  list(
    head(iris[, 1:2], 3),
    head(mtcars[, 1:3], 5)
  ),
  caption = '两个表格的故事。', booktabs = TRUE
)| 
 | 
 | 
当你不希望表格在 PDF 中浮动时,可以使用 LaTeX 软件包 longtable,它可以在多个页面上截断一个表格。要使用 longtable,请将 longtable = TRUE 参数传递给 kable(),并确保在 LaTeX 导言 (preamble) 中包含 \usepackage{longtable}(有关如何自定义 LaTeX 导言的信息,请参阅第 4.1 节)。当然,这与 HTML 输出无关,因为 HTML 中的表格并不需要浮动。
| Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species | 
|---|---|---|---|---|
| 5.1 | 3.5 | 1.4 | 0.2 | setosa | 
| 4.9 | 3.0 | 1.4 | 0.2 | setosa | 
| 4.7 | 3.2 | 1.3 | 0.2 | setosa | 
| 4.6 | 3.1 | 1.5 | 0.2 | setosa | 
| 5.0 | 3.6 | 1.4 | 0.2 | setosa | 
| 5.4 | 3.9 | 1.7 | 0.4 | setosa | 
| 4.6 | 3.4 | 1.4 | 0.3 | setosa | 
| 5.0 | 3.4 | 1.5 | 0.2 | setosa | 
| 4.4 | 2.9 | 1.4 | 0.2 | setosa | 
| 4.9 | 3.1 | 1.5 | 0.1 | setosa | 
| 5.4 | 3.7 | 1.5 | 0.2 | setosa | 
| 4.8 | 3.4 | 1.6 | 0.2 | setosa | 
| 4.8 | 3.0 | 1.4 | 0.1 | setosa | 
| 4.3 | 3.0 | 1.1 | 0.1 | setosa | 
| 5.8 | 4.0 | 1.2 | 0.2 | setosa | 
| 5.7 | 4.4 | 1.5 | 0.4 | setosa | 
| 5.4 | 3.9 | 1.3 | 0.4 | setosa | 
| 5.1 | 3.5 | 1.4 | 0.3 | setosa | 
| 5.7 | 3.8 | 1.7 | 0.3 | setosa | 
| 5.1 | 3.8 | 1.5 | 0.3 | setosa | 
| 5.4 | 3.4 | 1.7 | 0.2 | setosa | 
| 5.1 | 3.7 | 1.5 | 0.4 | setosa | 
| 4.6 | 3.6 | 1.0 | 0.2 | setosa | 
| 5.1 | 3.3 | 1.7 | 0.5 | setosa | 
| 4.8 | 3.4 | 1.9 | 0.2 | setosa | 
| 5.0 | 3.0 | 1.6 | 0.2 | setosa | 
| 5.0 | 3.4 | 1.6 | 0.4 | setosa | 
| 5.2 | 3.5 | 1.5 | 0.2 | setosa | 
| 5.2 | 3.4 | 1.4 | 0.2 | setosa | 
| 4.7 | 3.2 | 1.6 | 0.2 | setosa | 
| 4.8 | 3.1 | 1.6 | 0.2 | setosa | 
| 5.4 | 3.4 | 1.5 | 0.4 | setosa | 
| 5.2 | 4.1 | 1.5 | 0.1 | setosa | 
| 5.5 | 4.2 | 1.4 | 0.2 | setosa | 
| 4.9 | 3.1 | 1.5 | 0.2 | setosa | 
| 5.0 | 3.2 | 1.2 | 0.2 | setosa | 
| 5.5 | 3.5 | 1.3 | 0.2 | setosa | 
| 4.9 | 3.6 | 1.4 | 0.1 | setosa | 
| 4.4 | 3.0 | 1.3 | 0.2 | setosa | 
| 5.1 | 3.4 | 1.5 | 0.2 | setosa | 
| 5.0 | 3.5 | 1.3 | 0.3 | setosa | 
| 4.5 | 2.3 | 1.3 | 0.3 | setosa | 
| 4.4 | 3.2 | 1.3 | 0.2 | setosa | 
| 5.0 | 3.5 | 1.6 | 0.6 | setosa | 
| 5.1 | 3.8 | 1.9 | 0.4 | setosa | 
| 4.8 | 3.0 | 1.4 | 0.3 | setosa | 
| 5.1 | 3.8 | 1.6 | 0.2 | setosa | 
| 4.6 | 3.2 | 1.4 | 0.2 | setosa | 
| 5.3 | 3.7 | 1.5 | 0.2 | setosa | 
| 5.0 | 3.3 | 1.4 | 0.2 | setosa | 
| 7.0 | 3.2 | 4.7 | 1.4 | versicolor | 
| 6.4 | 3.2 | 4.5 | 1.5 | versicolor | 
| 6.9 | 3.1 | 4.9 | 1.5 | versicolor | 
| 5.5 | 2.3 | 4.0 | 1.3 | versicolor | 
| 6.5 | 2.8 | 4.6 | 1.5 | versicolor | 
Pandoc 支持多种类型的 Markdown 表格,例如简单表格、多行表格、栅格表格和管道表格。knitr::kable() 生成的是这样一个简单的表格:
Table:Markdown 的一个简单表格。
 Sepal.Length   Sepal.Width   Petal.Length   Petal.Width
-------------  ------------  -------------  ------------
          5.1           3.5            1.4           0.2
          4.9           3.0            1.4           0.2
          4.7           3.2            1.3           0.2
          4.6           3.1            1.5           0.2
          5.0           3.6            1.4           0.2
          5.4           3.9            1.7           0.4你可以在文档中使用任何类型的 Markdown 表格。为了能够交叉引用 Markdown 表格,它必须具有 Table: (\#label) Caption here 格式的标签标题,其中 label 必须具有前缀 tab:,例如 tab:simple-table。
如果决定使用其它 R 软件包生成表格,则必须确保表格环境的标签以 (\#label) 的格式出现在表格标题的开头(同样地,label 必须具有前缀 tab:)。你必须非常小心表格生成函数的 通用性:它应该在 HTML 和 LaTeX 输出格式下能够自动正常工作,因此必须在内部考虑输出格式(检查 knitr::opts_knit$get('rmarkdown.pandoc.to'))。当输出 HTML 表格时,标题必须写在 <caption></caption> 标签中,不过对于简单的表格,kable() 就足够了。如果你需要创建复杂的表格(例如,某些单元格跨越多列/行),则必须考虑上述问题。