前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >71-R分享01-Rmd新手入门指南

71-R分享01-Rmd新手入门指南

作者头像
北野茶缸子
发布2021-12-17 11:08:25
6.7K0
发布2021-12-17 11:08:25
举报
文章被收录于专栏:北野茶缸子的专栏

参见:https://www.math.pku.edu.cn/teachers/lidf/docs/Rbook/html/_Rbook/rmarkdown.html[1]

1. 什么是Rmd(R markdown)?

★借助于R的knitr和rmarkdown扩展包的帮助, 可以在Markdown格式的源文件中插入R代码, 使得R代码的结果能够自动插入到最后生成的研究报告中。”

我们可以将Rmd 理解为,可以在md 文档中运行R 代码,并能将R 代码的运行结果最终输入到输出报告中的文件。

输出格式可以是HTML、docx、pdf、beamer等。R Markdown的基础格式是markdown格式, 严格说来是Pandoc软件支持的增强版的markdown格式, 比如, 支持LaTex格式的数学公式, 支持各种编程语言语法彩色加亮显示,等等。

2. Rmd 的基本结构

一个Rmd 文件包含三个部分:

分别是:

  • yaml 格式的开头部分
  • 一般md 格式的正文部分
  • R 代码部分

我的第一个Rmd

选择Rmd 创建:

选择默认的值即可,这里选择输出为html:

直接选择knit 标志:

还不错:

3. 详说三大结构

3.1 开头部分

我们可以将Rmd 的开头部分理解为其元数据。可以用来规定文章标题、作者、日期、输出格式、输出设置等属性。

比如当我们用Rstudio 创建默认的Rmd:

头文件是:

代码语言:javascript
复制
---
title: "test"
author: "ghost"
date: "3/27/2021"
output: html_document
---

输出之后是这个亚子的:

头部分格式为yaml:

代码语言:javascript
复制
- #减号表并列
# #井号表注释
| #竖线表整块数据

这里我们不必细究yaml 的具体语法,通常的开头部分都是包括title, author, date, output 这四个部分的。而通过下面的格式进行定义:

代码语言:javascript
复制
key: "value"

而每个key 下面,可以对应subkey,用tab 间隔:

代码语言:javascript
复制
output: 
  html_document:
    toc: True

我们可以自定义一下dateoutput

日期

这里先提一下Rmd 的行内代码特性,行内代码的结果插入到一个段落中间, 代码以r`开头,以```结尾, 如r sin(pi/2)``在结果中会显示为1

我们可以利用Rmd 支持行内插入R代码的特性,利用函数Sys.time() 获得时间的返回值:

代码语言:javascript
复制
date: "`r Sys.time()`"

另外还可以结合format 函数:

代码语言:javascript
复制
> format(Sys.time(), '%d %B, %Y')
[1] "27 三月, 2021"

image.png

设置目录

我们可以在output 下,设定toc:

代码语言:javascript
复制
output: 
  html_document:
    toc: True
    toc_depth: 3

toc_depth 用来指定目录显示的标题级数,如3 表示只会显示到 ### 对应的标题。默认下,html_document 对应为3pdf_document 对应为2

如果你不喜欢在Rmd 文件中标记序号:

代码语言:javascript
复制
# a

## b
good!

## d
bad!

# c
hhhh!

还可以打开number_sections ,这样在输出结果中会自动标记序号:

代码语言:javascript
复制
---
title: "01-美化作图"
author: "Peng"
date: "`r Sys.time()`"
output: 
  html_document:
    toc: True
    number_sections: True
---

image.png

另外一个比较好用的是toc_float,其包括两个选项,collapsed 控制是否显示子标题;smooth_scroll 控制跳转动画,默认为T 分别表示不显示:

代码语言:javascript
复制
---
title: "01-美化作图"
author: "Peng"
date: "`r Sys.time()`"
output: 
  html_document:
    toc: True
    number_sections: True
    toc_float:
      collapsed: false
---

打开后,我们就可以在页面的右侧选择对应目录:

3.2 正文部分

正文部分遵循md 语法,如果你熟练的掌握了md 句法,可以跳过这一部分~

关于md 学习,可以参见:013. 用Markdown来写作[2]

先前提到过,Rmd 的行内代码特性,行内代码的结果插入到一个段落中间, 代码以r`开头,以```结尾, 如r sin(pi/2)``在结果中会显示为1

比如:

代码语言:javascript
复制
# 正文
今天是几号啊?
今天是`r mday(now())` 号。

image.png

3.3 代码块部分

代码块部分使用{r} chunk code 的形式:

代码语言:javascript
复制
library(lubridate)
now()

name 用来定义该段code chunk 的名称。

关于输出的几个选项

另外,根据R 代码的几个特征:

  • 是否运行
  • 是否显示代码
  • 是否显示输出结果
  • 是否显示输出的图像结果
  • 是否提示warning, message 或error

比如加载相关包的代码块,我们就可以使用:

代码语言:javascript
复制
library(lubridate)

这样可以在输出结果中不显示可能出现的一些警告。

其他选项

  • highlight 选项

转化后的R代码块缺省显示为彩色加亮形式。用选项highlight=FALSE关闭彩色加亮功能。

  • prompt和comment选项

默认下,输出的结果中的R 的代码开始是没有任何符号的;而R 代码的运行结果则是用井号保护的。

我们可以进行修改,用选项 prompt=TRUE将R 用大于号提示符开始;用选项comment=''将结果的保护符号替换成自定义内容,"" 则表示不用任何符号保护:

代码语言:javascript
复制
a <- 3
a

image.png

  • tidy 选项

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

代码语言:javascript
复制
s <- 0
for(x in 1:5) {s <- s + x^x; print(s)}

运行结果:

  • collapse 选项

通常代码块的代码,会根据其运行输出,拆分成多个文本块,如果我们不希望输出为:

可以设置collapse=TRUE,代码和结果都将在一个文本块中显示:

代码语言:javascript
复制
sin(pi/2)
## [1] 1
cos(pi/2)
## [1] 6.123234e-17

全局设定

我们先前对于代码块的设定,都是作用于局部,不同的代码块只遵循其局部自定义的内容:

如果我们希望代码块的设置在所有结果中生效,需要进行专门的声明,比如在代码块的开头进行声明:

代码语言:javascript
复制
knitr::opts_chunk$set(echo = TRUE)
knitr::opts_chunk$set(warning = F, message  = F)

这个setup 中配置的信息将会作用于全部的代码块了。

4. Rmd 文件的编译

RStudio 是一个集成的R软件环境, 可以用来编辑和执行R程序, 这个软件也可以用来编辑和编译R Markdown格式的文件, 使得R Markdown格式的文件变得容易使用。

使用RStudio 提供的knit 工具,我们可以将Rmd 文件转换成HTML格式、PDF格式(需要安装LaTeX编译软件)、MS Word格式。

如果不借助于RStudio 软件, 也可以用R软件、knitr包、rmarkdown包、pandoc软件来完成R Markdown源文件的编译。比如:

代码语言:javascript
复制
rmarkdown::render("myfile.Rmd", output_format = "html_document", encoding="UTF-8")
rmarkdown::render("myfile.Rmd", output_format = "word_document", encoding="UTF-8")

在李东风老师的书中,还总结了一些差别:

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

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

4.1 编译的过程

编译Rmd文件, 一般是调用rmarkdown::render() 函数执行任务。编译的第一步, 会调用knitr包的knit()函数将代码段中的程序依次运行, 结果保存为一个临时.md文件中, 图形结果暂存在单独的图形文件中, 文字结果会直接保存在临时.md文件中。编译的第二步, 调用外部程序Pandoc将临时的.md文件转换为要求的Word、HTML等输出格式;如果要求的输出是pdf_document, 则会调用Pandoc先将临时的.md文件转换为一个中间的.tex文件, 然后利用tinytex包调用外部的TinyTex软件将.tex文件编译为PDF结果。

4.2 其他格式文件的转换

  • 从HTML格式可以转换成PDF格式

打开浏览器进入选定的网页后,可以选择菜单“打印”, 选打印机为“另存为PDF”, 然后选“更多设置”, 将其中的“缩放”改为自定义, 比例改为“90%”, 就可以将HTML网页转换成PDF, 其中的数学公式、表格、图形都可以比较好地转换。注意,如果不缩小打印, 数学公式的编号以及较长的数学公式可能会被裁剪掉。

  • 从Word文件转换成PDF格式

使用Word软件的“文件-导出”或者“文件-另存为”功能即可。

  • 从PDF 转换为其他格式

可以使用adobe acrobat 软件,除了字体之外,还可以使用:

参考资料

[1]https://www.math.pku.edu.cn/teachers/lidf/docs/Rbook/html/_Rbook/rmarkdown.html: https://www.math.pku.edu.cn/teachers/lidf/docs/Rbook/html/_Rbook/rmarkdown.html

[2]013. 用Markdown来写作: https://www.yuque.com/go/doc/31592921?view=doc_embed

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 北野茶缸子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 什么是Rmd(R markdown)?
  • 2. Rmd 的基本结构
    • 我的第一个Rmd
    • 3. 详说三大结构
      • 3.1 开头部分
        • 日期
        • 设置目录
      • 3.2 正文部分
        • 3.3 代码块部分
          • 关于输出的几个选项
          • 其他选项
          • 全局设定
      • 4. Rmd 文件的编译
        • 4.1 编译的过程
          • 4.2 其他格式文件的转换
            • 参考资料
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档