2.5 表格

目前来说,生成一个表格的最方便的方法是使用函数 knitr::kable(),因为在 knitr 中有一些内部技巧可以使其与 bookdown 一起工作,并且用户并不需要知道这些实现细节。我们在本节后面将会解释如何使用其他软件包和函数。

和图片一样,带有标题的表格也将被编号并且可以被引用。kable() 函数将会为表格环境自动生成一个标签,即前缀 tab: 加上区块标签。例如,标签为 foo 的代码块的表格标签将是 tab:foo,并且我们仍然能够使用语法 \@ref(label) 来引用该表格。表 2.2 是一个简单的例子。

knitr::kable(
  head(mtcars[, 1:8], 10), booktabs = TRUE,
  caption = '一个包含 mtcars 数据前 10 行的表格。'
)
表 2.2: 一个包含 mtcars 数据前 10 行的表格。
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
)
表 2.3: 两个表格的故事。
Sepal.Length Sepal.Width
5.1 3.5
4.9 3.0
4.7 3.2
mpg cyl disp
Mazda RX4 21.0 6 160
Mazda RX4 Wag 21.0 6 160
Datsun 710 22.8 4 108
Hornet 4 Drive 21.4 6 258
Hornet Sportabout 18.7 8 360

当你不希望表格在 PDF 中浮动时,可以使用 LaTeX 软件包 longtable,它可以在多个页面上截断一个表格。要使用 longtable,请将 longtable = TRUE 参数传递给 kable(),并确保在 LaTeX 导言 (preamble) 中包含 \usepackage{longtable}(有关如何自定义 LaTeX 导言的信息,请参阅第 4.1 节)。当然,这与 HTML 输出无关,因为 HTML 中的表格并不需要浮动。

knitr::kable(
  iris[1:55, ], longtable = TRUE, booktabs = TRUE,
  caption = '由 longtable 软件包生成的表格。'
)
表 2.4: 由 longtable 软件包生成的表格。
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() 就足够了。如果你需要创建复杂的表格(例如,某些单元格跨越多列/行),则必须考虑上述问题。