李昕垚的博客

我想我不会再错过bookdown

第一次听说bookdown是在2016年5月R语言大会上。当场见到了传说中的谢益辉,整体感觉有几点:不善言辞、低调、很强的自我驱动力。这些印象与以往在谢益辉博客里的那个文风犀利、左手持倚天剑、右手执屠龙刀的谢大神反差很大。后来我意识到,他是郭靖啊,低调的天下第一。

bookdown有什么用

用官方文档的话来讲,bookdown融合了R、Markdown、Pandoc,我们可以用Rmarkdown写作,然后可以选择PDF, HTML, EPUB, Word等格式输出。我们可以把更多的精力放到内容的创作上去,而不是纠结于排版。

第一个实例

初次学习bookdown可以从bookdown-demo开始。

  1. 下载并解压bookdown-demo
  2. 在R里解压bookdown包,install.packages("bookdown")
  3. 在Rstudio打开刚下载的demo里的 bookdown-demo.Rproj。点击 Build Book 按钮

然后就可以得到html格式或者pdf格式的文档了

yml

yml文件在jekyll博客里很常见,通常是对整体的做一些设定。_bookdown.yml 也是如此,比如可以定义文档的顺序。下面代码分别定义了html和pdf的文档顺序

1
2
3
rmd_files:
html: ["index.Rmd", "abstract.Rmd", "intro.Rmd"]
latex: ["abstract.Rmd", "intro.Rmd"]

益辉文档里的YAML实例:

1
2
3
4
5
6
7
8
9
10
11
12
---
title: "Authoring A Book with R Markdown"
author: "Yihui Xie"
date: "`r Sys.Date()`"
site: "bookdown::bookdown_site"
output:
bookdown::gitbook: default
documentclass: book
bibliography: ["book.bib", "packages.bib"]
biblio-style: apalike
link-citations: yes
---

M-K与K-M

M-K与K-M是说render book的方法。M-K是先merge Rmd文件后一起knit,K-M是先单个knit Rmd文件再统一merge。两者的主要区别如下:

  1. M-K是在一个R线程里运行,K-M是在多个R线程里运行
  2. 章节之间有联系的话用M-K,每章节都希望是初始状态的话用K-M
  3. M-K要求knitr标签不重复,K-M只要求每个Rmd里标签不重复就行

bookdown默认的方法是M-K。但是可以在 _bookdown.yml 里设置 new_session: yes来切换到K-M。在K—M的 _bookdown.yml 里,book_filename选项可以设置为 _main.md的形式

book的内容

这一部分介绍book的一些元素和内容

markdown

最主要的东西莫过于markdown,整个book都是用markdown写的。

行内代码:

  1. 斜体。*斜体*斜体
  2. 粗体。**粗体**粗体
  3. 下标。H~2~O,H~2~O
  4. 上标。x^3,x^3
  5. 行内代码。codecode
  6. 链接。[www.xinyao.pub](http://www.xinyao.pub/)www.xinyao.pub
  7. 图片链接。![alt text or image title](path/to/image)
  8. 脚注。^[我是脚注],^[我是脚注]

标题:

  1. 一级标题。# 一级标题
  2. 二级标题。# 二级标题
  3. 三级标题。# 三级标题

有序列表:

1
2
3
1. red
2. green
3. blue

无序列表:

1
2
3
- red
- red
- red
  • red
  • red
  • red

引用:

1
2
3
> 我想学弹指神通
>
> --- 李昕垚

我想学弹指神通

— 李昕垚

bookdown的markdown扩展

公式的编号:

1
2
3
4
\begin{equation}
f\left(k\right) = \binom{n}{k} p^k\left(1-p\right)^{n-k}
(\#eq:binom)
\end{equation}

如果不需要编号:

1
2
\begin{equation*}
\end{equation*}

没有编号的一级标题: # (PART) Part I {-}

附录:# (APPENDIX) Appendix {-} ,表示在此标题后的均为附录部分

图表注释:

在knitr里,图片的注释是fig.cap = "A long long figure caption.",表格的注释是kable(caption = "A long long table caption.")。在bookdown里有了新的扩展,用(ref:label)即可,参考下面的代码

A normal paragraph.

(ref:foo) A scatterplot of the data cars using base R graphics.

{r foo, fig.cap=’(ref:foo)’}
plot(cars) # a scatterplot

R代码

行内R代码:r R_CODE

行间R代码:

1
x = mtcars

表格

1
2
3
4
5
6
knitr::kable(
list(
head(iris[, 1:2], 3),
head(mtcars[, 1:3], 5)
),
caption = 'A Tale of Two Tables.', booktabs = TRUE)

交叉引用

\@ref(label)[Section header text][link text](#ID)

自定义块

以下是最基本的自定义块

type='FOO'}
1
Some text for this block.

自定义块的样式是可以定义的。可以在CSS里通过div定义,然后在YAML通过includes导入。LaTeX类似,通过定义\newenvironment就能实现。

1
2
3
4
5
6
---
output:
bookdown::html_book:
includes:
in_header: style.css
---

knitr的block能实现简单的内容,如果想在自定义块里使用markdown,可以用block2来实现。

type='FOO'}
1
2
3
4
5
Some text for this block [@citation-key].
- a list item
- another item
- end the list with a blank line

注意上段代码,如果 block2内不是由一般的段落结尾,需要留一行空行。

参考文献

后记

html widgets

Shiny apps

1
2
knitr::include_app("https://yihui.shinyapps.io/miniUI/",
height = "600px")

输出格式

输出格式有3种,HTMLLaTeX/PDFE-Books。可以在第一个Rmd文档或者是在_output.yml里定义输出格式。例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
---
title: "An Impressive Book"
author: "Li Lei and Han Meimei"
output:
bookdown::gitbook:
lib_dir: assets
split_by: section
config:
toolbar:
position: static
bookdown::pdf_book:
keep_tex: yes
bookdown::html_book:
css: toc.css
documentclass: book
---
1
2
3
4
5
6
7
8
9
10
bookdown::gitbook:
lib_dir: assets
split_by: section
config:
toolbar:
position: static
bookdown::pdf_book:
keep_tex: yes
bookdown::html_book:
css: toc.css

HTML

LaTeX/PDF

E_Books

暂时不用~

bookdown-chinese

bookdown_chinese下载链接

下载后用RStudio打开bookdown-chinese.Rproj,点击 build

请李昕垚吃个糖?