class: center, middle, inverse, title-slide .title[ # R Markdown 简史 ] .author[ ###
谢益辉
,RStudio PBC ] .date[ ### 2022/06/11 @ 中国人民大学统计校友论坛 ] --- ## 个人简介 - RStudio 软件工程师(2013 至今),俗称码农 - 2002-09 中国人民大学统计本硕;2009-13 爱荷华州立大学统计博士 - 个人主页:[yihui.org](https://yihui.org) --- ## 个人兴趣 - 个人喜欢写代码(尽管码力相当业余),日常大约 95% R 加 5% JavaScript,其它编程语言一窍不通 - 更加喜欢写作(同样业余) - 写代码 + 写作 = 文学化编程(Literate Programming) --- background-image: url(https://user-images.githubusercontent.com/163582/124138837-ab39e580-da4c-11eb-8a32-0aa0ce53f65a.jpeg) background-size: contain background-position: right center ## 这些年 ## 干啥啦 ## 一个字 ## 写! --- ## 缘起 - Sweave: https://en.wikipedia.org/wiki/Sweave - 2007 年开始使用 Sweave,被它惊艳到:世上竟有如此大巧不工的神器! - 从此凡是涉及到计算的作业全用 Sweave 写,并且向周围同学安利它 --- ![我的某次作业截图](https://user-images.githubusercontent.com/163582/132703362-35a37fdc-a2c4-40d9-84a1-2ead3160a680.png) --- ## 为什么用 Sweave? - 为了可重复科学研究? - 不,我并没有那么远大的志向。 -- - 我只是想写作业能写得多快好省。 - 在知道 Sweave 之前,我只能跑一遍代码,复制结果,粘贴到(Word)文档里。 - 要是代码需要修改,那上面的步骤又得重复一遍。 --- ## Sweave 长什么样 ```tex \documentclass{article} \begin{document} <<>>= # 这是一个代码段 1 + 1 @ 这是正文的文本。 \end{document} ``` - 文件扩展名为 `.Rnw`,如 `test.Rnw` - 以 `<<>>=` 开始一段代码;以 `@` 开始一段文本 --- ## Sweave 如何厉害 - Sweave 的设计理念来自 WEB 和 noweb(随后介绍),但比它们强太多 - 例如,它引进了“代码段选项”的概念,以精细控制输出: ```tex <<echo=FALSE, width=8>>= plot(1:10) @ ``` --- ## Sweave 的先祖 - Donald Knuth, Literate Programming (1984): https://en.wikipedia.org/wiki/Literate_programming - 计算机代码 + 自然语言(文本) - tangle(抽取代码)与 weave(代码与文本混编) - WEB 与 CWEB (1987): https://en.wikipedia.org/wiki/Web_(programming_system) - noweb (1989): https://en.wikipedia.org/wiki/Noweb - 以上工具全都用 `<<>>=` 与 `@` 的语法 --- ## 文学化编程有何资格称“编程” 普通编程中,我们经常写一些小函数,然后在大函数中调用小函数,这样可以让程序模块化;文学化编程也可以将大代码单元化为小代码,如: ```tex <<chunk-A>>= add_one = function(x) { <<chunk-B>> } @ <<chunk-B>>= x + 1 @ ``` 一个完整案例:https://yihui.org/rlp/ 以及如何重用代码:https://yihui.org/en/2021/05/knitr-reuse/ --- ## knitr 的诞生 - Sweave 对文学化编程范式的实现非常聪明、简洁、也很超前(2002 出道) - 但它有很多局限性,如: - 无法控制图片输出的大小 - 只支持 LaTeX 输出 - 难以扩展 --- ## knitr 的诞生 - 有人写过一些 Sweave 扩展,如 **cacheSweave**(增加缓存功能),**pgfSweave**(超高质量的 TikZ 图形),**highlight**(代码高亮),以及 **R2HTML**(HTML 输出) - 但令人哭笑不得的是你只能用一种扩展(即:互不兼容),比如要缓存就不能用 TikZ 图形 - 所以我想设计一套系统,使之拥有所有以上功能,并且还具备扩展性 --- ## 再次回顾文学化编程的思想 - (为计算机准备的)程序代码 +(为活人准备的)文本 - 程序代码可以是任意语言:R、Python、Julia、JavaScript、C++、SQL,等等 - 文本也可以用任意文档语言:LaTeX、HTML、Markdown,等等 - knitr 的设计没有写死语言,理论上用户可以混编任意计算语言与文档语言 --- ## knitr 的开发历程 - 2011-10-16:开始动工 - 2012-01-17:初见公婆([发布到 CRAN](https://cran.r-project.org/package=knitr)) - 迄今已经发布 55 个版本:https://cran.r-project.org/src/contrib/Archive/knitr/ --- ## 第一本书(2013) 在我从爱荷华州立大学毕业前,我出版了人生中第一本书:[Dynamic Documents with R and knitr](https://yihui.org/en/2013/06/tips-for-writing-an-r-book/) .center[![1st ed of the knitr book](https://images.tandf.co.uk/common/jackets/crclarge/978148220/9781482203530.jpg)] --- ## Dynamic Documents with R and knitr - 反正不管怎样,我都得给 knitr 写文档,何不干脆写本书算了?(我年轻我怕谁) - 如何拼凑出这本书:(1)关于 knitr 的技术文档;(2)邮件列表和 Stack Overflow 论坛上的几千个问题;(3)关于 knitr 的内部技术细节 --- ## 第二版(2015) - 第一版的重心是 Rnw 文档(即:R + LaTeX) - 2014 年 R Markdown 诞生,并且很快超越了 Rnw 的流行,所以 2015 年我在书中增加了 R Markdown 的介绍,并出版了第二版 - 第三版?转眼又过了七年,确实需要出第三版,但我已经没有时间……(请问有壮士来帮我吗?) --- ## 经验教训 - 试着解决你自己经常遇到的某个痛点(比如我最初只是为了自己写作业写得更加 666 而开发的 knitr 包) - 当你解决自己的痛点后,再遇到有相同痛点的人,那么飞轮效应可能就来了([Flywheel effect](https://www.jimcollins.com/concepts/the-flywheel.html)) > [...] relentlessly pushing a giant, heavy flywheel, turn upon turn, building momentum until a point of breakthrough, and beyond --- ## 经验教训 - 如果你想做出有影响力的工作,那么我建议优先照顾深度,再考虑广度([Impact: Depth or Breadth?](https://yihui.org/en/2018/08/influence-depth-or-breadth/))把一件小事做好、做透。 - 怎样算深?比如,如果你要写点东西,那么不妨用写书的决心去写,而不是以发微博或朋友圈的心态去写。 - 利用社区和他人的力量。十多年来,**knitr** 在 Github 上收取了 440 多个来自社区的补丁和贡献:https://github.com/yihui/knitr/pulls 贡献者近百: https://github.com/yihui/knitr/graphs/contributors --- ## 经验教训 - 软件都是人写出来的,没有人是神仙;就算当前你看到一个软件有多优秀,它不可能是整个蛋糕,一定还有你发力改善甚至重写的余地。 - 但是…… -- - 十年后再回首我的历程,我很后悔当年过于年少轻狂,对 Sweave 不是很友好(有攻击和贬低的意思);前年我给作者去信表示悔意,但未收到回复,可能会成一生遗憾。 - 后发制人者有天然的优势(second-mover advantage),我们应该充分尊重前人的探索和奠基工作:https://yihui.org/en/2021/03/my-mistakes/ --- ## R Markdown 的诞生 - 第一代基于 R 包 **markdown**(2013-14):https://github.com/rstudio/markdown (注意不是 **rmarkdown**) - 只支持 HTML 输出 - 但还是流行起来了:https://rpubs.com --- ## 第二代 R Markdown - 基于 Pandoc https://pandoc.org - 多种输出格式: HTML, Word, PDF, PowerPoint, E-book, 等等 - 最初的试验:`knitr::pandoc()` 函数(2014) - 最终以 **rmarkdown** 包面世(2015):https://github.com/rstudio/rmarkdown --- ## R Markdown 的基本原理 `rmarkdown::render()` ≈ `knitr::knit()` + Pandoc ![R Markdown workflow](https://bookdown.org/yihui/rmarkdown-cookbook/images/workflow.png) --- ## R Markdown 支持多种计算语言 尽管“R Markdown”这个名字里带着 R 字,它并非只支持 R 语言。 https://bookdown.org/yihui/rmarkdown-cookbook/other-languages.html --- .center[![:image 45%, R Markdown: The Definitive Guide](https://bookdown.org/yihui/rmarkdown/images/cover.png)] (2018) https://bookdown.org/yihui/rmarkdown/ --- .center[![:image 45%, R Markdown: The Definitive Guide](https://bookdown.org/yihui/rmarkdown-cookbook/images/cover.png)] (2020) https://bookdown.org/yihui/rmarkdown-cookbook/ --- ## bookdown 包(2016) - 用 R Markdown 写书 - 支持 HTML、LaTeX/PDF 和 EPUB 输出 - 用写书的工具写一本关于写书工具的书:https://bookdown.org/yihui/bookdown/ --- ## blogdown 包(2017) - 用 R Markdown 做网站,背后是静态网站工具,如 Hugo、Jekyll、Hexo - 又是一本书:https://bookdown.org/yihui/blogdown/ --- ## 看朕给你打下的 R Markdown 江山 - rticles: https://github.com/rstudio/rticles - tufte: https://github.com/rstudio/tufte - pagedown: https://github.com/rstudio/pagedown - flexdashboard: https://github.com/rstudio/flexdashboard - xaringan: https://github.com/yihui/xaringan - shower: https://github.com/shower/shower - distill: https://github.com/rstudio/distill --- ## R Markdown 江山 - learnr: https://github.com/rstudio/learnr - pkgdown: https://github.com/r-lib/pkgdown - htmlwidgets: https://github.com/ramnathv/htmlwidgets - prettydoc: https://github.com/yixuan/prettydoc - minidown: https://github.com/atusy/minidown - rmdformats: https://github.com/juba/rmdformats - ... --- ## Quarto(2022) - 相聚离开,都有时候,没有什么会永垂不朽。 - 过去十年里我们开发了如此这般一大摞包,常言道:分久必合、合久必分。 - 于是 Quarto 面世:https://quarto.org - 集所有才华与颜值于一身,并打破 R 的(玻璃)天花板,冲入其它语言的社区(Python,说的就是你) - R Markdown 用户何去何从(可以按兵不动):https://yihui.org/en/2022/04/quarto-r-markdown/ --- class: center, middle # 谢谢! ## 幻灯片地址:[slides.yihui.org/2022-RUC-rmarkdown.html](https://slides.yihui.org/2022-RUC-rmarkdown.html)