博士生涯终于走到了最后一步了。这次全程用 R 和 Rmarkdown 相关的包完整写完了论文,现在总结一下个人经验和踩过的坑,希望给后来人提供参考经验,同时安利一下 Rmarkdown 这个提高生产力的工具。
选择 Rmarkdown 的理由
大部分大学的毕业论文对排版都着严格的排版要求,具体需要注意的细节可能有
- 图表要编号,并经常需要在文中交叉引用
- 引用文献,文中和文尾的参考文献格式需要注意
- 目录,图和表的目录
- 页眉页脚,字体字号行间距,标题副标题大小等等
个人感受而言,传统 Word 虽然易用,但所见即所得式的编辑模式会将作者很大一部分精力吸引到 “排版” 工作上,另外大部分论文插图较多,排版也很困难。而作为另一条路的 LaTeX 则功能强大然而语法复杂。LaTeX 将文本与排版结果分离,学习曲线陡峭。使用 LaTeX 颇有为码字而先修炼成排版工人的感觉。相比 Word 的上手容易精通难和 LaTeX 的复杂功能, 个人觉得 Rmarkdown 易用性和功能性之间达到了较好的平衡。Rmarkdown 既可实现 LaTeX 完全相同的最终论文排版效果,同时 markdown 语法简单易上手,学习成本相较 LaTeX 大为降低,直逼 Word 。另外,使用 Rmarkdown 还能生成 gitbook 的电子书,相较 pdf 格式也有良好的在线阅读体验(见 gitbook 在线电子书版)。
值得一提的是用 Rmarkdown 写毕业论文并不适合所有人。如果读者有有一定折腾的极客精神,懂一点 R 语言就更好了。
用 Rmarkdown 写论文
准备工作
首先我们需要安装 R 和 Rstudio 以及相关的包,具体包会在下面每一小节分别介绍。除此之外还需要 git/github 对文本源文件做版本控制,一个文本编辑器 (我用的 sublime text),以及用 Zotero 作为文献库管理软件。
其次,毕业论文包含很多材料,我们将创建一个项目文件夹来管理图片,数据,论文文本,引用文献记录 (bib) 等资料。这个论文项目可以保存在本地和在线保存在 github,从而实现备份和跨电脑工作的目的。
论文框架
前人们创建了好多基于 bookdown 的毕业论文模板,并在 Github 上分享。个人推荐的是 thesisdown。 它提供了基于 bookdown 的论文项目骨架,有助于快速地搭好框架。这样封面、目录、页眉页脚、引用文献等零碎的格式问题就基本搞定了。剩下的主要精力可以专注于码字上。
论文项目目录如下。其中,Rmd 文件即为章节文本,bib 和 csl 目录保存文献引用记录和引用格式 (apa),data 和 figure 目录保存数据和插图,prelims 保存 Rmd 格式的简介和前言。reedthesis.cls 和 template.tex 是论文 LaTeX 模板,针对具体排版要求可能需要调整代码。
.
├── 01-chap1.Rmd
├── 02-chap2.Rmd
├── 03-chap3.Rmd
├── 04-conclusion.Rmd
├── 05-appendix.Rmd
├── 99-references.Rmd
├── bib
│ └── thesis.bib
├── _book
│ ├── thesis.pdf
│ └── thesis.tex
├── _bookdown.yml
├── chemarr.sty
├── csl
│ └── apa.csl
├── data
│ └── flights.csv
├── figure
│ ├── reed.jpg
│ └── subdivision.pdf
├── index.Rmd
├── prelims
│ ├── 00-abstract.Rmd
│ └── 00--prelim.Rmd
├── reedthesis.cls
├── template.tex
└── thesisdown_demo.Rproj
作图
专业的作图是学术写作的灵魂。如何用图来简明扼要地传达信息是现代科研工作的基本功。
因为主要用 R 做数据分析,我选择的 R 绘图包是大名鼎鼎的 ggplot2。在此推荐的另一个包是 patchwork: 它采用简单的语法实现将多个 ggplot 图拼接成大图。其他类似功能的包有 cowplot, gridExtra,但实际体验还是 patchwork 更为优雅强大。
制表
制表用的 kable: rmarkdown 引擎 knitr 自带。配合的包有 kableextra。 可以实现表的标题,脚注,按行列分组等等功能。包的说明书写得非常详细,需要功能的时候对着查即可。
文献引用
Zotero, zotero 是在线文献管理工具,具体工作原理是创建账号之后就拥有了在线的文献库。装了 zotero 浏览器插件设置好之后看到文章即可将文献一键纳入收藏。这比起曾经用过的 mendeley 等工具方便了不少。而在 R 里也有相应的包与之匹配,也就是 citr.
citr 包的作用是在 Rstudio 里直接连 zotero 库就能直接插文献了。全程不用手动编辑. bib 库或者手动维护引用索引。添加引用的完整过程就是:看论文 -> 浏览器中用 zotero 将论文添加到库 -> 在 Rstudio 里将光标定位到需要插入引用的地方,用 citr 插件的 "insert citation" 连接 zotero 库,插入添加的文献。
值得一提的是在 Rstudio 1.4 预览版中,Zotero 管理的文献库将与 Rstudio 有更好的整合。无需安装额外包和配置即可在 Rstudio 里插入 Zotero 库中的文献,详情可参考官方文档。
最终效果展示:
下面聊聊我在用 Rmarkdown 写毕业论文中碰到的实际问题
如何与 word 选手合作
我碰到的第一个问题是:使用 Rmarkdown 写论文,如何与不懂 Rmarkdown 的合作者进行有效协作。更核心的是 word 强大的追踪修改的功能无法替代。
经过沟通尝试之后我最终做法还是在 Rmarkdown 里写好一个章节,直接复制 Rmarkdown 源文本进 word 发给导师,改完之后传回来我再改改复制进 Rmarkdown 生成 pdf。
非 R 语言生成图片的显示问题
插入图片的 markdown 语法为 
。但是在论文中的图需要控制长宽,需要有引用标签和标题等,最合适的办法是使用 rmarkdown 的 knitr 包自带函数include_graphics()
。这样可以用与 R 生成的图一样的设置来精确控制图片显示。
示例代码为:
```{r, out.width = "400px"}
knitr::include_graphics("path/to/image.png")
```
ggplot 作图时标签,标注中的特殊字符
主要是公式的上标下标,在 stack overflow 上有丰富的案例可以参考。主要使用的是 R 的expression
函数。
df <- data.frame(x = rnorm(10), y = rnorm(10))
temp <- expression("Spearman's"~rho == 0.34)
ggplot(df, aes(x = x, y = y)) +
geom_point() +
annotate("text", x = mean(df$x), y = mean(df$y),
parse = T, label = as.character(temp))
效果:
后记
所谓工欲善其事必先利其器,科研工作者也需要像手艺人一样对工具仔细挑选和精研。但学校课程很少专门开课传授这方面的知识。本文介绍用 Rmarkdown 准备毕业论文以作为 word, LaTeX 以外的第三种选择,希望能对有类似需求的同路人有所帮助。
最后需要强调的是,工具只是 “术”,要提高学术论文质量还是得修炼内功,安利一篇写好英语科技论文的诀窍,祝诸君在学术之路上武运昌隆。
发表 / 查看评论