10

R Markdown

可重复研究文档

Tidyverse 篇

有时候,我们需要展示和分享我们的数据分析结果给同行、老板或者老师。 那么,为了让老板能快速地的理解我们的分析思路和方法, 最好的方法,就是将分析背景、分析过程、分析结果以及图表等形成报告,让读者能重复和验证我们的结果,确保结论的真实可信。 因此,本章就将介绍如何生成分析报告(可重复性报告)。

什么是Rmarkdown

图片

markdown 基本语法

{MARKDOWN, EVAL = FALSE, INCLUDE = TRUE}
# This is a title

#  第一章   (注意   "#" 与 "第一章"之间有空格)
##  第一节  (同上,"##" 与 "第一节"之间有空格)

This is a sentence.

Now a list begins:
  
- no importance
- again
- repeat
  
A numbered list:
  
1. first
2. second

__bold__, _italic_, ~~strike through~~

常用的Markdown 语法:

<div style="width:400px"> Type this... | ...to get this -------------------------|------------------------------------ normal text | normal text italic text | italic text bold text |bold text bold italic text | bold italic text superscript^2^ | superscript^2^ ~~strikethrough~~ | ~~strikethrough~~ ` code text | code text` </div>

对于章节, 使用 # 符号:

R
# Header 1
## Header 2
### Header 3
#### Header 4
##### Header 5
###### Header 6
图片

如果需要制作列表,可以使用-符号

R
- first item
- second item
- third item
  • first item
  • second item
  • third item

如果希望列表带有数字编号,可以加上编号

R
1. first item
2. second item
3. third item
  • first item
  • second item
  • third item

如果想添加网页链接,可以用方括号和圆括号

R
[Download R](http://www.r-project.org/)

Download R

如果想制作简单表格,列与列之间用 | 分隔,表格的首行下面添加--------

R
Table Header  | Second Header
------------- | -------------
Cell 1, 1     | Cell 2, 1
Cell 1, 2     | Cell 2, 2
Table HeaderSecond Header
Cell 1, 1Cell 2, 1
Cell 1, 2Cell 2, 2

这样作表格可能会比较麻烦,我经常在这个网站在线表格转化器把表格弄好后,然后复制粘贴过来。

Elements of RMarkdown

Rstudio 创建 Rmd 文件: File -> New File -> R Markdown.

Rmd 文件基本构成(图中绿色括号地方)

  • metadata
  • text
  • code
图片

R Code chunks

在 Rmd 文档中写 R 代码,需要插入代码块(Code chunks),具体以 `{r} 开始,以 ` 结尾。可以用快捷方式Ctrl + Alt + I (OS X: Cmd + Option + I)创建代码块。

图片

点击knit(下图中红色地方),选择想要输出的文档格式即可。下图是Rmd文档与渲染效果效果,

示意图

我们也可以设置一些选项,控制代码块的运行方式(for more details see <http://yihui.name/knitr/>):

图片

生成html文档

希望html文档有章节号、目录或者更好显示表格,可以修改yaml头文件(用下面的内容替换Rmarkdown的头文件)

YAML
---
title: Habits
author: John Doe
date: "`[R表达式]`"
output: 
  html_document:
    df_print: paged
    toc: yes
    number_sections: yes
---

生成word文档

rmarkdown 生成的word功能不是很多,推荐使用officedown , officer, flextable宏包

生成pdf文档

pdf文档可以插入漂亮的矢量图和优雅的数学公式,所以备受同学们的喜欢。但往往我们写中文的时候,编译不成功。这里就来讲讲如何解决这些问题,推荐阅读这里,或者看这个视频

Instructions

  • 安装最新版本 R (>3.5) 和 RStudio Desktop (>1.2).
  • 安装pdf查看器,sumatrapdf网站
  • 安装 LaTeX. 然而这个软件会比较大 (e.g. MacTeX is approximate 3.9G). 如果你之前没有安装过 LaTeX,我推荐你安装轻量级的 tinytex. 安装方法如下,打开R,然后再命令行输入:
R
install.packages("tinytex")
tinytex::install_tinytex(dir = "D:\\Tinytex", force = T)

中途会有两次警告,按 “ 确定 ” 就可以了。

::: {.rmdnote}

国内下载 TinyTeX 比较慢,可以用浏览器或其它下载工具直接下载:https://github.com/yihui/tinytex-releases/releases 然后把下载的文件路径传给安装函数,下面四步走:

  • install.packages("tinytex")
  • tinytex::tlmgr_repo('http://mirrors.tuna.tsinghua.edu.cn/CTAN/')
  • tinytex:::install_prebuilt('TinyTeX-v2022.05.zip', dir = "D:\\Tinytex")
  • 添加环境变量 D:\Tinytex\bin\win32

:::

  • 修改头文件,用下面的内容替换Rmarkdown的头文件, 不要修改缩进
YAML
---
title: 'Going deeper with dplyr'
author: "王小二"
date: "`[R表达式]`"
output:
  pdf_document: 
    latex_engine: xelatex
    extra_dependencies:
      ctex: UTF8
    number_sections: yes
    df_print: kable
    toc: yes
classoptions: "hyperref, 12pt, a4paper"
---

使用方法

插入公式

我相信你已经熟悉了latex语法,那么我们在Rmarkdwon里输入 $$\frac{\sum (\bar{x} - x_i)^2}{n-1}$$,那么实际输出:

$$\frac{\sum (\bar{x} - x_i)^2}{n-1}$$

也可以使用latex的等式环境, 比如

LATEX
$$\Theta = \begin{pmatrix}\alpha & \beta\\
\gamma & \delta
\end{pmatrix}$$

输出

$$ \Theta = \begin{pmatrix}\alpha & \beta\\ \gamma & \delta \end{pmatrix} $$

插入图片

`{VERBATIM}

![图片](images/R_logo.png)
图片

运行代码

R
summary(cars)

表格

`{VERBATIM}

knitr::kable(iris[1:5, ], caption = "A caption")

TEXT
R
knitr::kable(iris[1:5, ], caption = "A caption")

需要更优美的表格,可参考这里

生成图片

`{VERBATIM}

plot(pressure)

TEXT

或者

`{VERBATIM}

library(tidyverse) library(nycflights13) library(showtext) showtext_auto()

flights %>% group_by(dest) %>% summarize( count = n(), dist = mean(distance, na.rm = TRUE), delay = mean(arr_delay, na.rm = TRUE) ) %>% dplyr::filter(delay > 0, count > 20, dest != "HNL") %>% ggplot(mapping = aes(x = dist, y = delay)) + geom_point(aes(size = count), alpha = 1 / 3) + geom_smooth(se = FALSE) + ggtitle("这是我的标题")

TEXT

文本内计算

`{VERBATIM}
The content can contain inline code like `[R表达式]`, too.

The content can contain inline code like [R表达式], too.

案例代码

延伸阅读

  • Markdown tutorial https://www.markdowntutorial.com (10分钟学完)
  • Markdown 中文教程 https://www.appinn.com/markdown/
  • Markdown 在线编辑器 https://pandao.github.io/editor.md/ http://editor.md.ipandao.com/
  • LaTeX tutorial https://www.latex-tutorial.com/quick-start/
  • Rmarkdown 介绍 https://bookdown.org/yihui/rmarkdown/
  • Rmarkdown 手册 https://bookdown.org/yihui/rmarkdown-cookbook/