21/22 markdown格式

因为之前已经学过了,就大概浏览一遍,补充一点以前没用,但可能以后会用到的内容。

引用嵌套:

张三说:李四这样说过

不想当将军的木匠不是好厨子。

23 R Markdown文件格式

在文件开头用三个减号组成的行包围的内容称为元数据, 可以用来规定文章标题、作者、日期、输出格式、输出设置等属性。

如果想将R Markdown文件借助于LaTeX格式转换为PDF, 需要在系统中安装一个TeX编译器。 现在的rmarkdown包要求使用tinytex扩展包以及配套的TinyTeX软件包, 好像不再支持使用本机原有的LaTex编译系统, 如果不安装tinytex,编译为PDF格式时会出错。

install.packages('tinytex')
tinytex::install_tinytex()

测试tinytex是否安装成功,结果为TURE则安装成功(注意:中间是三个冒号)

tinytex:::is_tinytex()

可以在R或RStudio中运行如下命令以生成含有运行结果的html文件:

rmarkdown::render("myfile.Rmd", output_format = "html_document", encoding="UTF-8")

用RStudio的Knit图标一键编译与用rmarkdown::render()命令编译有重要差别:

  • 用Knit图标编译,Rmd文件中的程序会在一个崭新的会话中执行, 当前会话中已经定义的函数、变量、导入的扩展包不会影响到编译结果;
  • rmarkdown::render()编译, Rmd文件中的程序是在当前会话中执行的, 会带来一定的兼容性问题, 有可能在别人的环境下就不能正确执行或者会给出不同结果。 但是,rmarkdown::render()可以通过程序调用, 比如,循环地从同一个Rmd生成一系列不同的报告。 为了不让当前会话环境干扰结果, 可以人为地打开一个新会话。

R Markdown也是我在学习的过程中一直使用的,简单基础的功能这里就不再重复记录,只记一些我以前不知道或者不熟悉且使用的功能。

输出表格

knitr包提供了一个 kable() 函数可以用来把数据框或矩阵转化成有格式的表格, 支持HTML、docx、LaTeX等格式。

x <- 1:10; y <- x^2; lmr <- lm(y ~ x)
co <- summary(lmr)$coefficients
print(co)

可以用knitr包的kable函数来显示:

knitr::kable(co, caption = 'summary of y=x^2')
Estimate Std. Error t value Pr(>|t|)
(Intercept) -22 5.5497748 -3.964125 0.0041530
x 11 0.8944272 12.298374 0.0000018

kable()函数的digits=选项可以控制小数点后数字位数, caption=选项可以指定表的标题内容。

R扩展包pander提供了更好的表格能力, 也能与knitr包很好的合作输出。 其pander()函数可以将多种R输出格式转换成knitr需要的表格形式。 如

# install.packages('pander')
library(pander)
pander::pander(lmr)

需要注意的是当表中中有中文时pander包会出错。

23.5 利用R程序插图

\```{r, echo=FALSE}
\knitr::include_graphics("https://els-jbs-prod-cdn.jbs.elsevierhealth.com/pb-assets/products/pictureshow/2020-ki-image-awards/01-Koch%27s-2020-Vision-1586362160893.jpg")
\```

为了转义上面的 \为人为添加
echo=FALSE代表不显示这段代码。

https://rmarkdown.rstudio.com/lesson-3.html

echo = FALSE prevents code, but not the results from appearing in the finished file. This is a useful way to embed figures.

knitr::include_graphics("https://els-jbs-prod-cdn.jbs.elsevierhealth.com/pb-assets/products/pictureshow/2020-ki-image-awards/01-Koch%27s-2020-Vision-1586362160893.jpg")

由于PDF中的中文编码不能自动识别, 所以在每个Rmd源文件的开头应该加上如下的设置, 使得生成PDF图时中文能够正确显示:

\```{r setup-pdf, include=FALSE}
\pdf.options(family="GB1")
\```

为了转义上面的 \为人为添加

https://rmarkdown.rstudio.com/lesson-3.html

include = FALSE prevents code and results from appearing in the finished file. R Markdown still runs the code in the chunk, and the results can be used by other chunks.

代码段选项

独立代码段以```R开头, 在大括号内还可以写一些选项, 选项之间以及与开始的r之间用逗号分隔, 所有选项写在同一行内不要换行。 选项都使用“选项名=选项值”的格式, 选项值除了使用常量外也可以使用全局变量名或表达式。 在大括号内开头的 r空格后写一个由英文大小写字母、数字、减号组成的标识符, 作为代码段的标签。 标签中不要用其它类型的字符, 下划线也不要用。 如

\```{r firstCode}  
\cat('This is 第一段, 有标签.\n')
\```
  • 如果希望不显示代码, 加选项echo=FALSE

  • 加选项tidy=TRUE可以自动重新排列代码段, 使得代码段格式更符合规范。

\```{r tidy=TRUE}
\s <- 0
\for(x in 1:5) {s <- s + x^x; print(s)}
\```
  • 加选项eval=FALSE, 可以使得代码仅显示而不实际运行。 这样的代码段如果有标签, 可以在后续代码段中被引用。

  • 加选项include=FALSE, 则本代码段仅运行, 但是代码和结果都不写入到生成的文档中。

  • 一个代码块的代码、输出通常被分解为多个原样文本块中, 如果一个代码块希望所有的代码、输出都写到同一个原样文本块中, 加选项collapse=TRUE。 例如, 没有这个选项时:

sin(pi/2)
cos(pi/2)
\```{r collapse=T}
\sin(pi/2)
\cos(pi/2)
\```

代码和结果被分成了4个原样文本块。 加上collapse=TRUE后,代码和结果都在一个原样文本块中。

用选项results=选择文本型结果的类型。 取值有:

  • markup, 这是缺省选项, 会把文本型结果变成HTML的原样文本格式。
  • hide, 运行了代码后不显示运行结果。
  • hold, 一个代码块所有的代码都显示完, 才显示所有的结果。
  • asis, 文本型输出直接进入到HTML文件中, 这需要R代码直接生成HTML标签, knitr包的kable()函数可以把数据框转换为HTML代码的表格。
\```{r collapse=TRUE, results='hold'}
\sin(pi/2)
\cos(pi/2)
\```

结果为:

sin(pi/2)
cos(pi/2)
## [1] 1
## [1] 6.123032e-17

选项warning=FALSE使得代码段的警告信息不进入编译结果, 而是在控制台(console)中显示。 有一些扩展包的载入警告可以用这种办法屏蔽。

选项error=FALSE可以使得错误信息不进入编译结果, 而是出错停止并将错误信息在控制台中显示。

选项message=FALSE可以使得message级别的信息不进入编译结果, 而是在控制台中显示。

图形选项

图形大小

用fig.width=指定生成的图形的宽度, 用fig.height=指定生成的图形的高度, 单位是英寸(1英寸等于2.54厘米)。

下面给出一个长宽都是1厘米的图例。

\```{r fig.width=1/2.54, fig.height=1/2.54}
\x <- c(-2:2)
\plot(x^2)
\```

fig.width=和fig.height=规定的是生成的图形大小, 实际生成图形的显示大小会受到dpi(分辨率)影响, 默认dpi是72(每英寸72个点), 也可以用dpi=选择分辨率。 转化后的HTML文件显示时不一定按原始大小显示。 用out.width=和out.height=可以指定显示大小, 但是必须是最终文件格式承认的单位, 比如HTML的图形大小单位是点(平常说屏幕分辨率的单位)。 或者写成如90%这样的百分比格式。 例如在上面的例子中加上输出度为页面宽度80%的选项:

\```{r fig.width=10/2.54, fig.height=10/2.54, out.width="80%"}
\plot(-2:2, x^2)
\```
par(mar = c(3, 3, 0.1, 0.1))
plot(1:10, ann = FALSE, las = 1)
text(5, 9, "Testing low level graphics")

其中text()函数的结果与高级图形函数plot()的结果一起显示。

fig.keep还可以取:all, 会把低级图形函数修改后的结果单独保存; last, 仅保留最后一个图形;first, 仅保留第一个图; none, 所有图都不显示出来。


以下这段Hexo不能正常编译,为截图:

img

img


修饰符

导数:f(x)f'(x)
二阶导数:f(x)f''(x)
偏导数写法:f(x,t)x\frac{\partial f(x,t)}{\partial x}

对齐与矩阵

为了产生对齐的公式, 在独立公式中使用aligned环境。 公式中的环境以\begin{环境名}开始, 以\end{环境名}结束, 用\\表示换行,用&表示一个上下对齐位置。 如
其中的alifned不能更改

f(x)=k=01k!xk=ex\begin{aligned} f(x)=& \sum_{k=0}^\infty \frac{1}{k!} x^k \\ = & e^x\end{aligned}

可以用pmatrix环境制作写在圆括号中的矩阵:

(x1x2x3x22)\begin{pmatrix} x_1 & x_2 \\ x_3 & x_{22} \end{pmatrix}

用bmatrix环境制作写在方括号中的矩阵:

[x1x2x3x22]\begin{bmatrix} x_1 & x_2 \\ x_3 & x_{22} \end{bmatrix}

用vmatrix制作写在绝对值号中的矩阵:

x1x2x3x22\begin{vmatrix} x_1 & x_2 \\ x_3 & x_{22} \end{vmatrix}

特殊字体

数学公式中的单词、文字必须用\text{...}保护,比如

CV=Sxˉ×100%\text{CV} = \frac{S}{\bar x} \times 100 \%

上例中如果不用\text{}保护,就会显示为:

CV=Sxˉ×100%CV = \frac{S}{\bar x} \times 100 \%

这里斜体的CV通常表示C乘V

有时用粗体表示向量或者矩阵, 用\boldsymbol{...}说明。如

v=(v1,v2)T\boldsymbol{v} = (v_1, v_2)^T

美术体英文字母用\mathcal{...}, 如A,B,C\mathcal{A, B, C}写法为$\mathcal{A, B, C}$

手写花体字母用\mathscr{...}, 如B,C,F,G\mathscr{B, C, F, G}写法为$\mathscr{B, C, F, G}$

与其他编程语言交互

Rmd文件中除了R代码段以外, 还可以插入Rcpp、Python、Julia、SQL等许多编程语言的代码段, 常用编程语言还可以与R代码段进行信息交换。

# python
install.packages('reticulate')
# 还需要安装Minicoda包
print("Hello, world")

属性设置

YAML元数据

.Rmd文件开头的上下各三个减号包围的内容,就是YAML元数据块(YAML meta data block), 块后面必须用空行分隔。
如本文开头的:

---
title: "R语言教程学习笔记"
author: "Shixq"
date: "2020/2/14"
output:
pdf_document: default
html_document: default
---

这三个设置会出现在转换后结果的标题部分。 RStudio的中文支持还是有时出现问题, 如果出现涉及到YAML的错误, 先将中文内容替换为英文试一试。

因为冒号:在属性设置中有特殊意义, 属性设置值如果含有冒号, 需要把整个属性值两边用单撇号界定。

属性值可以是列表或多项,例如:

---
title: 'This is the title: it contains a colon'
author:
- name: Author One
affiliation: University of Somewhere
- name: Author Two
affiliation: University of Nowhere
tags: [nothing, nothingness]
abstract: |
This is the abstract.

It consists of two paragraphs.
---

abstract属性用管道符号|表示开头,不需要结束标志,内容缩进。
这和我建博客使用的YAML元数据是一样的。

输出格式

.Rmd文件开头的YAML元数据中, 属性output选择输出的格式, 如

  • html_document是HTML输出;
  • pdf_document是PDF输出,通过系统中另外安装LaTeX编译系统转换;
  • word_document是docx格式的Word文件输出,等等。

其中default表示该输出格式完全使用默认设置。 在输出格式没有定制设置时必须有default指定。

输出格式设置

在每种输出格式后面还可以继续添加该输出特有属性。 如:

output:
html_document:
toc: ture
number_sections: true
word_document:
toc: true
pdf_document:
toc: true

html_documentoutput的属性, 隶属关系用缩进表示; html_document又有自己的属性toctoc_depth, 隶属关系用缩进表示。 属性toc: true表示要自动生成可点击的目录。 输出格式的属性toc_depth是目录包含的章节层级数。

html_document输出, 属性toc_float: true使得生成的文档在左侧显示一个目录导览窗格。 而toc_float属性又可以指定一些属性,隶属关系用缩进表示。 toc_float的属性collapse: true表示仅展开章节第一层级, smooth_scroll: true使得通过导览窗格跳跃时页面有平滑滚动过程显示。

输出格式的属性number_sectionstrue可以自动对章节编号。 HTML输出与PDF输出都支持此功能。

在章节自动编号时, 如果不是利用bookdown包而是基于基本的R Markdown, 文中的分节最高层级最好用一个井号, 对应于节, 如果用两个井号, 编号会变成0.1,0.2这样。

word输出章节自动编号及模板功能

Word文件不能自动编号, 解决办法是生成适当的模板文件, 如wordstyle.docx, 然后在Rmd文件的元数据部分为word_document输出增加reference_docx选项,如:

output: 
html_document:
toc: true
number_sections: true
word_document:
toc: true
reference_docx: wordstyle.docx

新编译的Rmd文件就可以采用wordstyle.docx的格式设置, 比如章节自动编号等。 目前目录标题还是英文, 需要在结果中人为地修改为中文。

对于html_document输出类型, 可以用theme属性设置一个主题, 取值如default, cerulean, journal, flatly, darkly, readable, spacelab, united, cosmo, lumen, paper, sandstone, simplex, yeti。

用highlight属性设置程序语言语法高亮样式, 可取值有default, tango, pygments, kate, monochrome, espresso, zenburn, haddock, and textmate。 用null表示取消语法高亮。

数学公式

Rmd格式支持数学公式, 在生成的HTML、Word、PDF中都可以正常显示数学公式。

以HTML为输出时, 会使用MathJax库显示数学公式。 这是一个用于在浏览器中显示数学公式的Javascript程序库, 显示效果很好, 还支持多种显示实现方式, 支持包括LaTeX在内的多种数学公式输入方法。

MathJax库很大, 所以一般是从其网站按需远程调用的, 但是远程调用MathJax库在网络不畅通时会使得公式显示极为缓慢甚至无法显示, 所以Rmd允许将MathJax本地化。 在.Rmd文件头部YAML元数据的某种HTML输出格式的属性中, 设置属性mathjax: local和就可以使得MathJax库被放在生成的HTML的一个下层目录中。 如:

output: 
html_document:
toc: true
self_contained: false
mathjax: local

注意设置mathjax: local同时必须设置self_contained: false。 在不使用本地MathJax副本时, 可以设置self_contained: true, 这使得图形文件、JavaScript代码等依赖项也打包在生成的单一HTML文件中, 如果设为false, 这些依赖文件会存放在单独文件中。 可以用lib_dir属性指定一个子目录用来存放这些依赖文件, 多个Rmd文件可以共用同一个lib_dir值。

将MathJax用mathjax: local属性本地化有明显的缺点。 这时,每个Rmd项目都需要一个MathJax库副本, 使得文件备份变得很麻烦。

LaTex和PDF输出

使用TinyTeX包进行。
许多LaTeX相关的设置在YAML元数据中进行设置。

---
output: pdf_document
fontsize: "12pt"
papersize: "a5"
geometry: "margin=1in"
---

其中属性fontsize, papersize和geometry都是LaTeX选项。
使用较小的纸张大小(如a5)和较大的字体(12pt), 可以使得制作的PDF结果容易放大显示, 这对于将PDF文件传送到屏幕较小的电子书阅读器上或者手机上阅读时比较有用。

  • 用属性documentclass指定LaTeX文档类型, 比如article是论文格式, book是图书格式。 ctexart和ctexbook是适用于中文的格式, 但兼容性不好。

  • fontsize是正文字体大小, 可取10pt, 11pt, 12pt, 其中10pt是缺省大小。

  • geometry用来指定geometry包的参数。

  • 默认的LaTeX编译引擎是pdfLaTeX。 可以在pdf_document输出的属性中设置latex_engine: xelatex将引擎替换成xeLaTeX。 xeLaTeX的优点是支持UTF8编码,可以使用系统中现有字体, 而我们在写中文的R Markdown文档时必须使用UTF-8编码