12.2.3 Rmarkdown文件中的代码段编写

12.2.3 Rmarkdown文件中的代码段编写

Rmarkdown文件的另一个重要组成部分是代码段(Code Chunk)。一般而言,在Rmarkdown文件中插入代码段有以下三种方式。

·手工输入代码段标记符,以“```{r}”开头,以“```”结尾。

·使用编辑器工具栏上的Insert按钮。

·使用组合键Ctrl+Alt+I。

上述三种方式都可以在Rmarkdown文件中插入代码段,建议使用后两种方式,这样不太容易出错。代码段编写完毕后,可通过如下三种方式执行代码:手动选择Ctrl+Enter键、单击RStudio右上角的Run按钮、单击某代码块右侧的三角形按钮,示例如下:

在{r}中,可以使用Knitr包的参数调整代码块的部分参数,接下来介绍代码块的控制,可以将代码块参数称为代码头。

1.代码段的命名

Rmarkdown文件可以对代码段进行命名,示例如下:

值得注意的是,r和name之间一定要使用空格隔开,由于Rmarkdown提供了交叉引用功能,因此同一个Rmarkdown文件名称不可以重复,否则编译会报错。快速定位代码块示例如图12-21所示,用户可以通过图12-21中左下角的弹出式菜单快速定位代码块。

图12-21 快速定位代码块示例

命名代码块后,用户还可以通过代码头参数建立缓存,避免每次运行都重复执行代码。

2.代码段的输出控制

代码头可以通过设置参数控制代码是否运行、代码输出结果和代码是否显示等,示例如下:

上述代码中的eval参数可以控制代码是否运行,eval=FALSE表示不运行代码。Knitr包提供了数十种选项,用户可以使用这些选项控制自动化报告输出的内容。下面重点介绍几种常用的控制选项参数含义,如图12-22所示,完整的选项说明可以参考网址http://yihui.name/knitr/options/。

图12-22 代码头常用控制选项参数含义

(1)eval。eval控制代码是否显示,若eval=FALSE,则显示代码,但不执行和输出代码结果。当用户希望输出示例代码或不通过注释代码来禁用代码执行时,可使用eval=FALSE。

(2)include。include控制代码是否运行,若include=FALSE,则执行代码,但不显示所有输出。如果数据分析过程不需要输出中间参数,但是需要执行代码,可使用include=FALSE。

(3)echo。echo控制是否隐藏代码。若echo=FALSE,则表示隐藏代码,但会执行代码块并输出结果。如果只展示代码执行结果而不展示代码,设置echo=FALSE。

(4)results。results控制代码块执行输出的结果形式,如文本、图表等。该参数有四个取值(更多细节参考网址http://yihui.name/knitr/options/):markup(标记显示输出);asis(文本显示输出);hold(末尾显示输出);hide(隐藏输出)。

(5)message。message控制是否显示控制台输出的信息,message=FALSE表示不显示信息。

(6)warning。warning控制代码执行中的警告信息是否输出。如果需要展示代码执行的警告信息,可使用warning=TRUE。

3.代码段的全局选项

用户都有自己的书写习惯和特殊需求,当发现一些默认的代码段设置不符合需要时,可以通过全局选项对这些设置进行修改。在代码段中调用knitr::opts_chunk$set()函数可以修改选项,如果不喜欢“>”的注释方式,可以使用如下代码进行调整:

设置了上述代码后,在输出代码或者注释时会出现以下效果:

4.代码段的缓存

cache参数用于设置代码块执行是否需要缓存,可以设置为TRUE,也可以设置为FALSE。若cache参数默认设置为FALSE,则每生成一次HTML页面,都将重新执行每一个代码块。如果用户编写的代码非常复杂,不希望每一次都重新执行所有代码块,可以将cache参数设置为TRUE。这样代码块第一次执行后会将结果缓存下来,在多次执行代码块生成HTML页面时,代码就不再重复执行,而是直接使用之前缓存的结果。程序复杂度高的时候,设置代码段缓存可以节约代码执行时间。

5.内联代码

在Markdown文本中,除了可以在代码块执行代码外,还可以通过内联代码的方式执行一些简单的代码,即使用“r”直接将代码嵌入文档。用户可以借助于内联代码功能在Markdown文本中嵌入简单代码的输出结果。