第 1 章 欢迎

A Markdown-formatted document should be publishable as-is, as plain text, without looking like it’s been marked up with tags or formatting instructions.

— John Gruber

这是一份 R Markodwn 文档。 Markdown 提供一种简洁的格式语法,用来生成 HTML、PDF 和 MS Word 文档。

当你点击 Knit 按钮时,就会生成一份包含正文和代码执行结果的文档。你可以像这样嵌入 R 代码块:

summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

1.1 如何参与改进

改进原则

  1. 不要引入新的 LaTeX 宏包,在我看来,上游 ElegantBook 使用的宏包已经足够多了,详见 https://d.cosx.org/d/421349-latex/2
  2. 书籍风格尽可能简洁,本人信奉 simple is better
  3. 不要自定义 Pandoc’s LaTeX 模版,Pandoc 内建的模版已经功能很全面了,下游的 R Markdown 生态已经甩掉了自己造的大量 LaTeX 模版。为保持与下游的完美兼容,也为了更加轻量地输出多种文档格式,也尽可能多地保持多种输出格式的风格一致。
  4. 本书输出格式目标是 HTML/PDF/EPUB,可以推动上游优化 Pandoc 模版或者 ElegantBook 模版

1.2 运行环境

xfun::session_info(c("rmarkdown", "bookdown", "knitr"), dependencies = FALSE)
## R version 3.6.2 (2019-12-12)
## Platform: x86_64-apple-darwin15.6.0 (64-bit)
## Running under: macOS Catalina 10.15.4
## 
## Locale: en_US.UTF-8 / zh_CN.UTF-8 / en_US.UTF-8 / C / en_US.UTF-8 / en_US.UTF-8
## 
## Package version:
##   bookdown_0.18 knitr_1.28.2  rmarkdown_2.1
## 
## Pandoc version: 2.9.2

文武线

ruler()
----+----1----+----2----+----3----+----4----+----5----+----6----+----
123456789012345678901234567890123456789012345678901234567890123456789

1.3 Pandoc

Pandoc 自诞生以来已历 15 个春秋,Github 星级 18.5k,而日常使用的 Hive 不过区区 3k。Pandoc 现已被各大 Linux 发行版(如 CentOS/Ubuntu 等)收录。下面给出一个使用 Pandoc 的简单例子

echo "hello, world!" > note.md
pandoc note.md -s -o note.tex # markdown 文本转化为 tex 文本
pandoc note.md -o note.pdf    # markdown 文本转化为 pdf 文档
pandoc note.md -o note.html   # markdown 文本转化为 html 文档

Pandoc 支持数十种文档输出格式,更多命令参数说明见 https://pandoc.org/MANUAL.html。可不可以不要 R,也不要 R Markdown 呢?当然可以,详见 https://github.com/annProg/PanBook,基于 Pandoc’s Markdown 实现一次写作,多样输出!

1.4 已有 Block

引理 1.1 For any two random variables \(X_1\), \(X_2\), they both have the same probability distribution if and only if \[\varphi _{X_1}(t)=\varphi _{X_2}(t)\]
定理 1.1 If \(X_1\), …, \(X_n\) are independent random variables, and \(a_1\), …, \(a_n\) are some constants, then the characteristic function of the linear combination \(S_n=\sum_{i=1}^na_iX_i\) is \[\varphi _{S_{n}}(t)=\prod_{i=1}^n\varphi _{X_i}(a_{i}t)=\varphi _{X_{1}}(a_{1}t)\cdots \varphi _{X_{n}}(a_{n}t)\]
命题 1.1 The distribution of the sum of independent Poisson random variables \(X_i \sim \mathrm{Pois}(\lambda_i),\: i=1,2,\cdots,n\) is \(\mathrm{Pois}(\sum_{i=1}^n\lambda_i)\).
证明 The characteristic function of \(X\sim\mathrm{Pois}(\lambda)\) is \(\varphi _{X}(t)=e^{\lambda (e^{it}-1)}\). Let \(P_n=\sum_{i=1}^nX_i\). We know from Theorem 1.1 that \[\begin{equation*} \begin{split} \varphi _{P_{n}}(t) & =\prod_{i=1}^n\varphi _{X_i}(t) \\ & =\prod_{i=1}^n e^{\lambda_i (e^{it}-1)} \\ & = e^{\sum_{i=1}^n \lambda_i (e^{it}-1)} \end{split} \end{equation*}\] This is the characteristic function of a Poisson random variable with the parameter \(\lambda=\sum_{i=1}^n \lambda_i\). From Lemma 1.1, we know the distribution of \(P_n\) is \(\mathrm{Pois}(\sum_{i=1}^n\lambda_i)\).
In some cases, it is very convenient and easy to figure out the distribution of the sum of independent random variables using characteristic functions.
推论 1.1 The characteristic function of the sum of two independent random variables \(X_1\) and \(X_2\) is the product of characteristic functions of \(X_1\) and \(X_2\), i.e., \[\varphi _{X_1+X_2}(t)=\varphi _{X_1}(t) \varphi _{X_2}(t)\]
练习 1.1 (Characteristic Function of the Sample Mean) Let \(\bar{X}=\sum_{i=1}^n \frac{1}{n} X_i\) be the sample mean of \(n\) independent and identically distributed random variables, each with characteristic function \(\varphi _{X}\). Compute the characteristic function of \(\bar{X}\).
Applying Theorem 1.1, we have \[\varphi _{\bar{X}}(t)=\prod_{i=1}^n \varphi _{X_i}\left(\frac{t}{n}\right)=\left[\varphi _{X}\left(\frac{t}{n}\right)\right]^n.\]

1.5 数学公式

数学公式加粗可能是最常见的需求之一, elegantbook 宏包提供的文类 elegantbook.cls 已经调用了 bm 宏包1。有了 bm 宏包,就可以使用 bm 宏包提供的 \bm{} 命令,而不需要调 \boldsymbol{} 加粗希腊字母,如将 \(\alpha\) (正常)加粗为 \(\bm{\alpha}\)(粗体)。为了在 HTML 网页中显示加粗效果,则还不够,默认情况下, MathJax 是不认识 \bm{} 命令的,所以需要在 header.html 自定义 \bm{} 命令:

<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
      TeX: {
        Macros: {
          bm: ["{\\boldsymbol #1}",1],
        }
      }
    });
</script>

进一步地,使用常用的 3 个取消符号 \(\bcancel{///}\) 需要在 header.html 添加 JS 库 cancel.js

<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
      TeX: {
        Macros: {
          bm: ["{\\boldsymbol #1}",1],
        },
        extensions: ["cancel.js"]
      }
    });
</script>

并在 preamble.tex 文件中添加一行代码加载 cancel 宏包

\usepackage[makeroom]{cancel}

1.6 自定义 block

基于 Pandoc 自定义 block 是一件很有意思的事情,目前不想让模版过于复杂,仅给出几个最常用的例子。如何自定义可以去看谢益辉的新书 R Markdown Cookbook2

要做的还有很多

这是警告

这是提示

这是注意

普通说明