文章目录
为什么使用使用Rmarkdown写博客?
- 现在的博客如知乎、优快云等一般都支持Markdown写作
- R的Rmarkdown集成了Markdown、Rcode和Rcode输出,非常适用于展示数据分析报告
- Rmarkdown的
*.Rmd
文件可以导出为*.md
文件 - 当写作有关于R的内容时,特别是其中含有代码及运行结果,使用Rmarkdown写作并导出md文件时,其中的Markdown说明文字、Rcode和Rcode输出如图片、表格等均能良好显示。且R代码会以文字的形式(而非图片)出现在结果中,以方便读者复制后运行。
- 另Ramrkdown除了支持R以外,也支持Python、SQL等众多语言,Rmarkdown使用这些语言时该方法依旧适用
写作流程
- 使用Rmarkdown写作
- 将
*.Rmd
文件运行并导出为*md
文件 - 将
*.md
文件中Rcode生成的图片的本地路径修改为图床路径 - 直接将修改后的
*md
文件内容粘贴到优快云或使用mdnice转化后粘贴到知乎
使用Rmarkdown写作时的几个技巧
第一个cell:setup设置
- 控制Rmarkdown中后续所有cell的默认行为
- comment = “#” 表示Rcode运行结果默认以"#"开头,方便区分Rcode与结果
- collapse = T 表示每一个cell的输出默认合并在一起:
- fig.height和fig.width控制Rcode生成图片的大小
knitr::opts_chunk$set(comment = "#", collapse = T,
fig.height = 5, fig.width = 5)
collapse设置对cell输出的影响见下
collapse = T的结果
print("hello")
# [1] "hello"
print("hello")
# [1] "hello"
collapse = F的结果
print("hello")
# [1] "hello"
print("hello")
# [1] "hello"
展示表格
使用knitr::kable函数将data.frame导出为markdown形式的表格
knitr::kable(head(iris), format = "markdown")
Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species |
---|---|---|---|---|
5.1 | 3.5 | 1.4 | 0.2 | setosa |
4.9 | 3.0 | 1.4 | 0.2 | setosa |
4.7 | 3.2 | 1.3 | 0.2 | setosa |
4.6 | 3.1 | 1.5 | 0.2 | setosa |
5.0 | 3.6 | 1.4 | 0.2 | setosa |
5.4 | 3.9 | 1.7 | 0.4 | setosa |
展示回归结果
broom包可以整理回归结果为data.frame,因而可以配合knitr::kable函数进行展示
使用broom::tidy函数展示回归系数、标准误、假设检验P值等
knitr::kable(broom::tidy(lm(iris$Sepal.Length ~ iris$Sepal.Width)))
term | estimate | std.error | statistic | p.value |
---|---|---|---|---|
(Intercept) | 6.5262226 | 0.4788963 | 13.627631 | 0.0000000 |
iris$Sepal.Width | -0.2233611 | 0.1550809 | -1.440287 | 0.1518983 |
使用broom::glance函数展示回归汇总统计量,如 R 2 R^2 R2、 A I C AIC AIC、 B I C BIC BIC等
knitr::kable(broom::glance(lm(iris$Sepal.Length ~ iris$Sepal.Width)))
r.squared | adj.r.squared | sigma | statistic | p.value | df | logLik | AIC | BIC | deviance | df.residual |
---|---|---|---|---|---|---|---|---|---|---|
0.0138227 | 0.0071593 | 0.8250966 | 2.074427 | 0.1518983 | 2 | -182.9958 | 371.9917 | 381.0236 | 100.7561 | 148 |
导出md文件
将写作完成的*.Rmd
文件保存,打开新的Rconsole运行以下代码,即可导出*.md
文件。注意应将input和output参数修改为实际的文件名和路径
knitr::knit(input = "./*.Rmd", output = "./*.md")
修改Rcode生成图片的路径
将*.md
文件中Rcode生成的图片的本地路径修改为图床路径
- 非Rcode生成的图片,在Rmarkown写作中直接使用图床路径,因而导出
*.md
文件后不需要再修改 - 在导出
*.md
文件时,若有Rcode生成的图片,则会自动生成figure文件夹,里面是Rcode生成的图片 - 导出的
*.md
文件中图片为本地路径,故需要挨个上传到图床并在*.md
文件中更改为图床路径
如果Rcode生成的图片非常多,挨个上传图片并将本地路径更改为图床路径也是一件比较费时间的事,可以参考以下思路自动完成这个过程:
*.md
文件本质上是一个文本文件,因而可以直接读入到R中- 图片上传到图床时,生成的url地址一般为“图床路径”+“图片名称”
- 使用正则表达式匹配
*.md
文件中Rcode生成图片的本地路径 - 将匹配到的本地路径修改为图床路径,然后保存为新的
*.md
文件即可
参考代码
library(readr) # 使用read_file和write_file读写md文件
library(stringr) # 使用str_extract_all提取md文件中图片的本地路径
rm(list = ls()) # 清空工作空间!!!
# 读入md文件为字符串
md <- read_file("./博客.md")
# 从字符串中提取Rcode生成图片的名称
fig_png <- unlist(str_extract_all(string = md, pattern = "figure..*\\.png"))
png <- c()
for (i in 1:length(fig_png)) {
png <- c(png, unlist(strsplit(fig_png[i], split = "/"))[2])
}
# 将md文件中图片的本地路径修改为图床路径
# https://*****/img/为我的图床地址
for (i in 1:length(png)) {
new_md <- str_replace_all(string = md,
pattern = png[i],
replacement = paste0("https://*****/img/", png[i]))
}
# 保存新的md文件;打开后发现Rcode生成图片的本地路径已全部修改为图床路径
write_file(md, "./new_r_parse_eval.md")
粘贴md文件内容到博客
- 优快云支持类似
$\sum_{i=1}^{n}$
的LaTeX代码,可以直接将*.md
文件内容粘贴上去 - 知乎不支持类似
$\sum_{i=1}^{n}$
的LaTeX代码,使用公式时需在其公式编辑器内编辑;此时可将*.md
文件内容粘贴到mdnice这个排版工具中转化后,再贴到知乎上