R语言学习笔记14
21/22 markdown格式
因为之前已经学过了,就大概浏览一遍,补充一点以前没用,但可能以后会用到的内容。
引用嵌套:
张三说:李四这样说过
不想当将军的木匠不是好厨子。
23 R Markdown文件格式
在文件开头用三个减号组成的行包围的内容称为元数据, 可以用来规定文章标题、作者、日期、输出格式、输出设置等属性。
如果想将R Markdown文件借助于LaTeX格式转换为PDF, 需要在系统中安装一个TeX编译器。 现在的rmarkdown包要求使用tinytex扩展包以及配套的TinyTeX软件包, 好像不再支持使用本机原有的LaTex编译系统, 如果不安装tinytex,编译为PDF格式时会出错。
install.packages('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) |
可以用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') |
需要注意的是当表中中有中文时pander包会出错。
23.5 利用R程序插图
\```{r, echo=FALSE} |
为了转义上面的 \
为人为添加
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} |
为了转义上面的 \
为人为添加
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} |
-
如果希望不显示代码, 加选项
echo=FALSE
。 -
加选项
tidy=TRUE
可以自动重新排列代码段, 使得代码段格式更符合规范。
\```{r tidy=TRUE} |
-
加选项
eval=FALSE
, 可以使得代码仅显示而不实际运行。 这样的代码段如果有标签, 可以在后续代码段中被引用。 -
加选项
include=FALSE
, 则本代码段仅运行, 但是代码和结果都不写入到生成的文档中。 -
一个代码块的代码、输出通常被分解为多个原样文本块中, 如果一个代码块希望所有的代码、输出都写到同一个原样文本块中, 加选项collapse=TRUE。 例如, 没有这个选项时:
sin(pi/2) |
\```{r collapse=T} |
代码和结果被分成了4个原样文本块。 加上collapse=TRUE后,代码和结果都在一个原样文本块中。
用选项results=
选择文本型结果的类型。 取值有:
markup
, 这是缺省选项, 会把文本型结果变成HTML的原样文本格式。hide
, 运行了代码后不显示运行结果。hold
, 一个代码块所有的代码都显示完, 才显示所有的结果。asis
, 文本型输出直接进入到HTML文件中, 这需要R代码直接生成HTML标签, knitr包的kable()
函数可以把数据框转换为HTML代码的表格。
\```{r collapse=TRUE, results='hold'} |
结果为:
sin(pi/2) |
选项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} |
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%"} |
par(mar = c(3, 3, 0.1, 0.1)) |
其中text()函数的结果与高级图形函数plot()的结果一起显示。
fig.keep还可以取:all, 会把低级图形函数修改后的结果单独保存; last, 仅保留最后一个图形;first, 仅保留第一个图; none, 所有图都不显示出来。
以下这段Hexo不能正常编译,为截图:
修饰符
导数:
二阶导数:
偏导数写法:
对齐与矩阵
为了产生对齐的公式, 在独立公式中使用aligned环境。 公式中的环境以\begin{环境名}
开始, 以\end{环境名}
结束, 用\\
表示换行,用&
表示一个上下对齐位置。 如
其中的alifned不能更改
可以用pmatrix环境制作写在圆括号中的矩阵:
用bmatrix环境制作写在方括号中的矩阵:
用vmatrix制作写在绝对值号中的矩阵:
特殊字体
数学公式中的单词、文字必须用\text{...}
保护,比如
上例中如果不用\text{}
保护,就会显示为:
这里斜体的CV通常表示C乘V
有时用粗体表示向量或者矩阵, 用\boldsymbol{...}
说明。如
美术体英文字母用\mathcal{...}
, 如写法为$\mathcal{A, B, C}$
。
手写花体字母用\mathscr{...}
, 如写法为$\mathscr{B, C, F, G}$
。
与其他编程语言交互
Rmd文件中除了R代码段以外, 还可以插入Rcpp、Python、Julia、SQL等许多编程语言的代码段, 常用编程语言还可以与R代码段进行信息交换。
# python |
print("Hello, world") |
属性设置
YAML元数据
.Rmd文件开头的上下各三个减号包围的内容,就是YAML元数据块(YAML meta data block), 块后面必须用空行分隔。
如本文开头的:
--- |
这三个设置会出现在转换后结果的标题部分。 RStudio的中文支持还是有时出现问题, 如果出现涉及到YAML的错误, 先将中文内容替换为英文试一试。
因为冒号:在属性设置中有特殊意义, 属性设置值如果含有冒号, 需要把整个属性值两边用单撇号界定。
属性值可以是列表或多项,例如:
--- |
abstract属性用管道符号|表示开头,不需要结束标志,内容缩进。
这和我建博客使用的YAML元数据是一样的。
输出格式
.Rmd文件开头的YAML元数据中, 属性output
选择输出的格式, 如
html_document
是HTML输出;pdf_document
是PDF输出,通过系统中另外安装LaTeX编译系统转换;word_document
是docx格式的Word文件输出,等等。
其中default表示该输出格式完全使用默认设置。 在输出格式没有定制设置时必须有default指定。
输出格式设置
在每种输出格式后面还可以继续添加该输出特有属性。 如:
output: |
html_document
是output
的属性, 隶属关系用缩进表示; html_document
又有自己的属性toc
和toc_depth
, 隶属关系用缩进表示。 属性toc: true
表示要自动生成可点击的目录。 输出格式的属性toc_depth
是目录包含的章节层级数。
对html_document
输出, 属性toc_float: true
使得生成的文档在左侧显示一个目录导览窗格。 而toc_float
属性又可以指定一些属性,隶属关系用缩进表示。 toc_float
的属性collapse: true
表示仅展开章节第一层级, smooth_scroll: true
使得通过导览窗格跳跃时页面有平滑滚动过程显示。
输出格式的属性number_sections
为true
可以自动对章节编号。 HTML输出与PDF输出都支持此功能。
在章节自动编号时, 如果不是利用bookdown包而是基于基本的R Markdown, 文中的分节最高层级最好用一个井号, 对应于节, 如果用两个井号, 编号会变成0.1,0.2这样。
word输出章节自动编号及模板功能
Word文件不能自动编号, 解决办法是生成适当的模板文件, 如wordstyle.docx, 然后在Rmd文件的元数据部分为word_document输出增加reference_docx选项,如:
output: |
新编译的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: |
注意设置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元数据中进行设置。
--- |
其中属性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编码