16  HTML 文档

从本章开始,接下来的三个章节都围绕数据交流的工具及其案例展开。日常工作中,有的需要产出具有丰富交互内容的网页文档(HTML 文档),有的需要产出排版精美、符合格式要求的、可打印的便携式文档(PDF 文档),有的需要可协作共享、可编辑修改的办公文档(Office 文档)。在 R 语言社区,陆续出现两套解决方案,一个是以 rmarkdown 包为核心的 R Markdown 生态,另一个是以 Quarto 为核心的文档写作和发布系统。继 R Markdown 出现 10 余年后,2022 年 RStudio 公司发布 Quarto 系统,整合 R Markdown 生态,提供统一的语法。截止写作时间,相比于成熟的 R Markdown 生态,Quarto 系统还在路上。因此,不拘泥于 R Markdown 还是 Quarto,根据使用场景、实践经验、工具现状,选择最合适的工具介绍,整体上,以 Quarto 为主,R Markdown 补位的方式介绍。

16.1 文档元素

无论是 R Markdown 还是 Quarto,都是站在巨人 Pandoc 的肩膀上,Pandoc 在普通 Markdown 的基础上提供了许多扩展支持,通过一些简单的标记,大大丰富了文档内容,下面介绍的内容适用于 R Markdown 和 Quarto,无论文档最终的输出格式如何。

16.1.1 样式

文字样式,如加粗、倾斜、上下标等。 加粗倾斜

16.1.2 图片

其一插入代码生成的图片,其二导入外部制作好的现成图片。

flowchart LR
  A[Hard edge] --> B(Round edge)
  B --> C{Decision}
  C --> D[Result one]
  C --> E[Result two]
flowchart LR
  A[Hard edge] --> B(Round edge)
  B --> C{Decision}
  C --> D[Result one]
  C --> E[Result two]
图 16.1: 流程图

ggplot2 图形

library(ggplot2)
ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_point(aes(color = Species)) +
  theme_classic()

图 16.2: 一幅简单的 ggplot2 图形

16.1.3 表格

Markdown 表格、knitr 制作的表格

16.1.4 列表

常见的列表有无序列表、有序列表及其嵌套。

有序的列表。

  1. 第一条
  2. 第二条

无序的列表。

  • 第一条
  • 第二条

有序列表的嵌套。

  1. 条目 1
  2. 条目 2
  3. 条目 3
    1. 条目 3.1
    2. 条目 3.2

无序列表的嵌套。

  • 条目 1
  • 条目 2
    • 条目 2.1
    • 条目 2.2

可交叉引用的有序列表。

  1. 第一个人是好的.
  2. 第二个人是坏的.
  3. 第三个人是丑陋的.

(@) 中添加标识符,如 (@good) 就可以引用列表中的条目 (1)。

16.1.5 引用

除了引用外部书籍、文章、刊物等的内容,还有长文档内部的交叉引用,这项功能是非常需要的,涉及图、表、公式、定理,参考文献,列表条目等。

16.1.6 脚注

If you imagine that this pen is Trellis, then Lattice is not this pen.1

— Paul Murrell

16.1.7 公式

行内公式一对美元符号 \(\alpha\) ,行间公式 \[\alpha\] ,如 方程式 16.1

\[ L(\beta,\boldsymbol{\theta}) = f(y;\beta,\boldsymbol{\theta}) = \int_{\mathbb{R}^{n}}N(t;D\beta,\Sigma(\boldsymbol{\theta}))f(y|t)dt \tag{16.1}\]

多行公式逐行编号,多行公式中对某一(些)行编号都不支持。多行公式共用一个编号,如 方程式 16.2

\[ \begin{aligned} L(\beta,\boldsymbol{\theta}) & = \int_{\mathbb{R}^{n}} \frac{N(t;D\beta,\Sigma(\boldsymbol{\theta}))f(y|t)}{N(t;D\beta_{0},\Sigma(\boldsymbol{\theta}_{0}))f(y|t)}f(y,t)dt\\ & \varpropto \int_{\mathbb{R}^{n}} \frac{N(t;D\beta,\Sigma(\boldsymbol{\theta}))}{N(t;D\beta_{0},\Sigma(\boldsymbol{\theta}_{0}))}f(t|y)dt \\ &= E_{T|y}\left[\frac{N(t;D\beta,\Sigma(\boldsymbol{\theta}))}{N(t;D\beta_{0},\Sigma(\boldsymbol{\theta}_{0}))}\right] \end{aligned} \tag{16.2}\]

推荐在 equation 公式中,使用 split 环境,意思是一个公式很长,需要拆成多行,如 方程式 16.3

\[ \begin{split} \mathrm{Var}(\hat{\beta}) & =\mathrm{Var}((X'X)^{-1}X'y)\\ & =(X'X)^{-1}X'\mathrm{Var}(y)((X'X)^{-1}X')'\\ & =(X'X)^{-1}X'\mathrm{Var}(y)X(X'X)^{-1}\\ & =(X'X)^{-1}X'\sigma^{2}IX(X'X)^{-1}\\ & =(X'X)^{-1}\sigma^{2} \end{split} \tag{16.3}\]

注意,\mathbf 只对字母 \(a,b,c,A,B,C\) 加粗,mathjax 不支持公式中使用 \bm\(\theta,\alpha,\beta,\ldots,\gamma\) 加粗,应该使用 \boldsymbol

16.2 制作报告

Quarto Report 文档

16.2.1 SQL 查询

library(DBI)
conn <- DBI::dbConnect(RSQLite::SQLite(),
  dbname = system.file("db", "datasets.sqlite", package = "RSQLite")
)

Base R 内置的数据集都整合进 RSQLite 的样例数据库里了,

dbListTables(conn)
 [1] "BOD"              "CO2"              "ChickWeight"      "DNase"           
 [5] "Formaldehyde"     "Indometh"         "InsectSprays"     "LifeCycleSavings"
 [9] "Loblolly"         "Orange"           "OrchardSprays"    "PlantGrowth"     
[13] "Puromycin"        "Theoph"           "ToothGrowth"      "USArrests"       
[17] "USJudgeRatings"   "airquality"       "anscombe"         "attenu"          
[21] "attitude"         "cars"             "chickwts"         "esoph"           
[25] "faithful"         "freeny"           "infert"           "iris"            
[29] "longley"          "morley"           "mtcars"           "npk"             
[33] "pressure"         "quakes"           "randu"            "rock"            
[37] "sleep"            "stackloss"        "swiss"            "trees"           
[41] "warpbreaks"       "women"           

随意选择 5 行数据记录,将结果保存到变量 iris_preview

SELECT * FROM iris LIMIT 5;

查看变量 iris_preview 的内容

iris_preview
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa

结束后关闭连接

dbDisconnect(conn = conn)

16.3 制作演示

Quarto Presentation

16.4 编写书籍

Quarto Book 网页格式


  1. (on the difference of Lattice (which eventually was called grid) and Trellis) DSC 2001, Wien (March 2001)↩︎