R Markdown: 数据报告生成利器
此篇文章翻译自谢益辉新书 《R Markdown: The Definitive Guide》 的前三章节,内容有所删减,主要介绍了 R Markdown 的相关结构及语法规则,如果想了解更多更详细的内容推荐您阅读原书。
安装
这里假设您已经安装了 R (https://www.r-project.org) 和 RStudio IDE (https://www.rstudio.com) 。Rstudio 并不是必须的,但安装它会使您更加容易地使用 R Markdown。如果您没有安装 RStudio IDE,您将不得不安装 Pandoc( http://pandoc.org ),否则就不需要单独安装 Pandoc,因为在安装 RStudio 时已经将它捆绑安装了。接下来,您可以在 R 中安装 rmarkdown
包:
|
|
如果您想要生成 PDF 类型文档输出,您将需要安装 LaTeX 。对于那些以前没有安装过 LaTeX 的 R Markdown 用户,我们建议您安装 TinyTeX(https://yihui./tinytex/):
|
|
TinyTeX 相当于一款轻量级、跨平台、易于维护的 LaTeX 。在将 LaTeX 或 R Markdown 文档编译成 PDF 时,tinytex
可以帮助您自动安装所需的相关 R 包,同时还能确保一个 LaTeX 文档被编译成正确的次数,以解决所有的交叉引用问题。如果您不明白这两件事是什么意思,应该按照我们的建议来安装 TinyTeX,因为这些细节往往并不值得您花费时间和精力去关心。
使用 rmarkdown
包、RStudio/Pandoc 和 LaTeX,您应该能够编译大多数R Markdown 文档。在某些情况下,您可能需要其他软件包,我们将在必要时提到它们。
参考文献
- R Core Team. 2018. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
- Xie, Yihui. 2018f. Tinytex: Helper Functions to Install and Maintain Tex Live, and Compile Latex Documents. https://github.com/yihui/tinytex.
基础知识
R Markdown 为数据科学提供了一个创作框架。R Markdown 能胜任以下两个任务:
- 保存并执行代码;
- 生成可共享的高质量报告。
R Markdown 的设计初衷是为了更容易地实现报告内容的可重复性,这是因为计算代码和叙述都在同一个文档中,结果是由源代码自动生成的。并且 R Markdown 支持数十种静态和动态/交互式输出格式。
如果您更喜欢观看视频进行学习,我们建议您查看网站 https://rmarkdown.rstudio.com,并在 “Get Started ” 中观看视频,其中包括了 R Markdown 的基础知识。
文档结构
下面是一份非常简易的 R Markdown 文档,是一个带有 .Rmd
拓展名的纯文本文档。
|
|
|
|
您可以使用任何文本编辑器(包括但不限于 RStudio)来创建这样的文本文档。如果使用 RStudio,您可以从 File -> New File -> R Markdown
中创建一个新的 Rmd 文档。
一份 R Markdown 文档有三个基础组成部分:元数据,文本和代码。元数据是在三个连接符 ---
之间的内容。元数据的语法是 YAML( YAML 不是标记语言 ),所以有时它也被称为 YAML metadata 或 YAML frontmatter。 需要注意的是,缩进在 YAML 中十分重要,忽视它会让你付出惨重代价。请参阅谢益辉所写的 《bookdown》(2016)一书中的 附录b.2 来了解一些简单的例子,这些示例展示了 YAML 语法。
文档的主体遵循元数据书写的规则。文本的语法是 Markdown,将在第 2.5 节中进行介绍。有两种类型的计算机代码,在第 2.6 节中进行了详细解释:
- 代码块:以三个重音符及所使用语言开始,其中
r
代表所使用的程序语言,并以三个重音符结束。 可以在花括号中填写块选项(如:将图形高度设置为5英寸:{r, fig.height=5}
)。 - 内联代码:以 ``r` 开始,并以单个重音符结束。
文档编译
最简单的方式莫过于在 RStudio 中单击 Knit
按钮,对应的快捷键为 Ctrl + Shift + K
(在 macOS 中为 Cmd + Shift + K
)。当然也可以直接运行代码 rmarkdown::render
来进行渲染编译,如:
|
|
当编译多个文档时,使用函数更加方便,因为可以直接使用循环来进行渲染编译。
参考卡片
RStudio 已经创建了大量的参考卡片,它们可以在 https://www.rstudio.com/resources/cheatsheets/ 上免费获得。
输出格式
有两种输出格式:documents 和 presentations 。所有可用的格式如下所示 :
beamer_presentation
github_document
html_document
ioslides_presentation
latex_document
md_document
odt_document
pdf_document
powerpoint_presentation
rtf_document
slidy_presentation
word_document
我们将在第 3 章和第 4 章详细地记录这些输出格式。在其他扩展包中提供了更多的输出格式(从第 5 章开始)。对于 Rmd 文件的 YAML 元数据中的输出格式名称,如果格式来自扩展包,您需要包含包名(若格式来自于 rmarkdown
包,则不需要 rmarkdown::
前缀 ),例如:
|
|
每种输出格式通常都有多种格式选项。所有这些选项都记录在 R 包 help 页面上。例如,您可以在 R 中键入 ?rmarkdown::
打开关于 html_document
格式的 help 页面。当您想要使用某些选项时,必须将这些值从 R 转换成 YAML,例如:
|
|
可以用 YAML 写为:
|
|
YAML 中的字符串通常不需要引号(``dev:“svg”和
dev:svg是相同的),除非它们包含特殊字符,比如冒号
:。如果您不确定是否应该引用字符串,那么用
yaml` 包来测试它,例如:
|
|
注意,上面例子中的副标题是由于冒号而引用单引号的。
如果某一选项有子选项(这意味着该选项的值是 R 中的列表),则子选项需要进一步缩进,例如:
|
|
一些选项将被传递给 knitr ,比如 dev
、fig_width
和 fig_height
。这些选项的详细文档可以在 knitr 文档页面 上找到。请注意,实际的 knitr 选项名称可能有所不同。特别是,knitr 在名称中使用 .
,但 rmarkdown 使用 _
,例如,在 rmarkdown 中,fig_width
对应于knitr 中的 fig.width
。
一些选项将被传递给 Pandoc,比如 toc
、toc_depth
和 number_sections
。当有疑问时,您应该参考 Pandoc 文档。R Markdown 输出格式函数通常有一个pandoc_args
参数,它应该是传递给 Pandoc 的参数的字符向量。如果您发现任何没有由输出格式参数表示的 Pandoc 特性,您可以使用这个终极论证,例如:
|
|
Markdown 语法
内联格式
-
斜体 :
_text_
或*text*
-
粗体 :
**text**
-
下标 :
H~3~PO~4~
渲染为 $H_3PO_4$ -
上标 :
Cu^2+^
渲染为 $Cu^{2+}$ -
脚注 :
^[This is a footnote.]
-
内联代码 :
`code`
, 可以使用 n+1 个重音符输出包含 n 个重音符的代码块。 -
超链接 :
[text](link)
-
图片链接 :

-
引用 :
1 2 3 4 5 6 7 8 9
@Manual{R-base, title = {R: A Language and Environment for Statistical Computing}, author = {{R Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2017}, url = {https://www.R-project.org/}, }
块级元素
-
标题
1 2 3 4 5
# First-level header ## Second-level header ### Third-level header
如果不想让某个标题被编号,可以在标题后面添加
{-}
或者{.unnumbered}
,如:1
# Preface {-}
-
无序列表
1 2 3 4 5 6
- one item - one item - one item - one more item - one more item - one more item
-
有序列表
1 2 3 4 5
1. the first item 2. the second item 3. the third item - one unordered item - one unordered item
-
引用
1 2 3 4 5
> "I thoroughly disapprove of duels. If a man should challenge me, I would take him kindly and forgivingly by the hand and lead him to a quiet place and kill him." > > --- Mark Twain
“I thoroughly disapprove of duels. If a man should challenge me, I would take him kindly and forgivingly by the hand and lead him to a quiet place and kill him.”
— Mark Twain
-
代码块
1 2 3 4 5 6 7
``` This text is displayed verbatim / preformatted ``` Or indent by four spaces: This text is displayed verbatim / preformatted
数学表达式
$f(k) = {n \choose k} p^{k} (1-p)^{n-k}$
: $f(k) = {n \choose k} p^{k} (1-p)^{n-k}$
$$f(k) = {n \choose k} p^{k} (1-p)^{n-k}$$
:
$$ f(k) = {n \choose k} p^{k} (1-p)^{n-k} $$
代码块选项
单击 Insert
按钮,对应快捷键为 Ctrl + Alt + I
(macOS:Cmd + Option + I
)。
在 https://yihui.name/knitr/options 中有大量的代码块可选项,在此我们列出常用的一部分:
-
eval=TRUE
:执行当前代码块;1 2 3 4 5 6 7 8
```{r} # execute code if the date is later than a specified day do_it = Sys.Date() > '2018-02-14' ``` ```{r, eval=do_it} x = rnorm(100) ```
-
echo=TRUE
:输出源代码; -
result
:当设置为'hide'
,文本输出将被隐藏;当设置为'asis'
,文本输出将被 “原样” 书写。 -
collapse=TRUE
:将文本输出和源代码合并为单个代码块输出,更加紧凑; -
warning
,message
,error
:是否在输出文档中显示警告、消息和错误; -
include=FALSE
:运行当前代码并且不显示任何源代码与输出结果; -
cache
:是否启用高速缓存。如果启用了缓存,则在下一次编译文档时不会对相同的代码块进行评估(如果代码块没有被修改),这将节省您的时间; -
fig.width
,fig.height
:(图形设备)块的大小(英寸)。注意:fig.dim = c(6, 4)
意味着fig.width = 6
并且fig.height = 4
; -
out.width
,out.height
:输出文档中 R 图片的输出大小。可以使用百分比,例如out.width = '80%'
表示页面宽度的 80%; -
fig.align
:图片的对齐方式; -
dev
:图形设备保存 R 图片的格式。如'pdf'
,'png'
,'svg'
,'jpeg'
; -
fig.cap
:图片标题; -
child
:您可以在主文档中包含子文档。这个选项选择一条通向外部文件的路径。
如果某个选项需要经常被设置为多个代码块中的值,您可以考虑在文档的第一个代码块中全局设置它:
|
|
图片
本地图片亦可以使用代码块选项进行调节,例如:
|
|
如果您想要淡入一个不是由 R 代码生成的图形,您可以使用 knitr::include_graphics()
函数,它使您能够更好地控制图像的属性,而不是像 
这样的 Markdown 语法难以调解图片属性。
表格
使用 knitr::kable()
函数可以简易的创建表格,表格标题可以通过 caption
来设置,例如:
|
|
如果您正在寻找更高级的表格样式控制,建议您使用 kableExtra 包,它提供了定制 PDF 和 HTML 表格外观的功能。在第 12.3 节中解释了 bookdown
包如何扩展 rmarkdown 的功能,以允许在文本中轻松地交叉引用数字和表格。
参考文献
- Xie, Yihui. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://yihui.name/knitr/.
输出文档
HTML 文档
为了输出 HTML 文档,首先要在 YAML 元数据中写入 output: html_document
:
|
|
目录(Table of contents)
|
|
toc: true
:输出目录;toc_depth
:所输出标题的最小级别;toc_float: true
:目录悬停于内容左侧,并一直可见;collapsed
(默认为TRUE
) :初始只显示顶级标题,随内容滚动目录逐级展开;smooth_scroll
(默认为TRUE
) :点击目录标题是否导航到指定内容。
目录编号 (Section numbering)
|
|
注意,如果文档中没有一级标题,那么二级标题将被命名为 0.1
, 0.2
……
选项卡 (Tabbed sections)
|
|
.tabset
:使主标题的所有子标题与 .tabset 属性一起出现在选项卡中,而不是作为独立的部分;.tabset-fade
:选项卡切换时淡入淡出;.tabset-pills
:改变选项卡外观,使其类似 “药丸”。
外观与风格
|
|
theme
:主题是从 Bootswatch 主题库中提取的,适用的主题包括:default
,cerulean
,journal
,flatly
,readable
,spacelab
,united
,cosmo
,lumen
,paper
,sandstone
,simplex
, 和yeti
.highlight
:代码高亮模式。支持的风格包括:default
,tango
,pygments
,kate
,monochrome
,espresso
,zenburn
,haddock
和textmate
.
图片选项
|
|
fig_width
和fig_height
:图片宽度和高度;fig_caption
:控制图片是否包括标题;dev
:图片渲染格式,默认为png
。
表格打印
默认表格输出格式为:
Option | Description |
---|---|
default | Call the print.data.frame generic method |
kable | Use the knitr::kable function |
tibble | Use the tibble::print.tbl_df function |
paged | Use rmarkdown::print.paged_df to create a pageable table |
设定为 paged 格式后输出形式为:
|
|
TABLE 3.2: The options for paged HTML tables.
Option | Description |
---|---|
max.print | The number of rows to print. |
max.print | The number of rows to print. |
cols.print | The number of columns to display. |
cols.min.print | The minimum number of columns to display. |
pages.print | The number of pages to display under page navigation. |
pages.print | The number of pages to display under page navigation. |
rownames.print | When set to FALSE turns off row names. |
代码折叠
|
|
code_folding: hide
:初始默认不显示代码,查看者可点击进行显示;code_folding: show
:初始默认显示代码,查看者可点击进行隐藏;
高级定制
保留 Markdown 文件
当运行一个 R Markdown 文件(*.Rmd
)时,将创造一个 Markdown 文件(*.md
)并将该文件通过 Pandoc 转换为 HTML 文件。如果想要保留 Markdown 文件,可以使用 keep_md
选项:
|
|
添加本地 HTML 文档
可以通过添加额外的 HTML 内容或完全替换核心 Pandoc 模板来完成更高级的输出定制。为了在文档头部或文档主体之前/之后包含内容,您可以使用以下选项:
|
|
自定义模板
|
|
有关模板的其他详细信息,请参考 Pandoc 模板 上的文档。您还可以研究默认的 HTML 模板 default.html5
。
其他类型文档格式控制方式类似,如欲详细了解请 参考原作 。