- 已编辑
谢大官宣精简版的 R Markdown,让我想起来三年前写过的一个 R 包,是用 markdown 制作文档和幻灯片的,写完后自用了一段时间(主要是制作教学课件),然后就一直雪藏,懒得发布。这回回去一看,它居然还能用,不如趁着残留的一点热情发出来,谁愿意玩一玩就拿去。
这个包我给它起名叫做 deepdown,译作”敌破挡“。
安装:
remotes::install_github("pzhaonet/deepdown")
示例文件:
RStudio - New File - R Markdown - From Template - deepdown
有三个模板可选,分别是 deepdown book,deepdown document, deepdown slides。初次使用建议选择 document,会得到一个 markdown 示例文档,点击 Knit 毛线球或者 ctrl+shift+k, 就可以得到输出文件了。不过,我更推荐用 deepdown::deepdown("你的 Rmd 文件名")
来转换,具体原因以后再说。
三个模板输出的都是 html 文件:document 模板输出不分页的网页,book 模板输出像 pagedown 那种分页的书稿,而 slides 模板输出 xaringan 那种幻灯片。建议先用 document,因为我在这个示例文档里列举了这个包支持的大部分功能。
这些功能是惊人的,但都不是我写的,而是来自一个 JS 库 Markdeep。感兴趣的朋友请阅读他家的文档。我随便列几个:
- 用统一的规则插入图片、表格、视频、音频,包括他们的标题和交叉引用。
- 支持图片与文字的混排。
- 用 ASCII 字符画图。
- 插入日历。
- 段落分栏。
当初看到这个库觉得有趣,心想要是能把里面的 R 代码运行的结果直接嵌入导出的文件就好了,所以就动手写了这个包。它所做的事情很简单,仅仅是一个移植和连接。值得一提的是,得到的 html 文件可以直接用文本编辑器打开编辑,里面的主体部分本身就是 markdown 语法,这跟 xaringan 可能是类似的原理(这个我没有仔细研究)。
谢大在文中说“层出不穷的‘新功能’会让开发者和用户都感到兴奋,但我有点越来越兴奋不起来了。“这些年,我手头攒了很多强大的工具,但利用率似乎都不够高,属于技术过剩,常常有种手握沉甸甸的金箍棒却找不到妖精的失落和疲惫。于是想放下。最近两三年,一旦遇到让人坐不住的新技术,我就先问自己:”学过来有什么用?不学又怎么样?“企图摆脱这种诱惑,得到某种解脱。久而久之,再遇见新技术竟然坐住了。当然,也可能是不再年轻的缘故罢。
这个包迟迟不发布的原因之一是它不完美,有在开发者看来肉眼可见的毛病,不过或许不影响使用者,比如说跟毛线球的结合有 bug;身材臃肿(我把使用的 js 库都打包进去了,为了离线使用);没法生成单一的 html 文件(跟 xaringan 类似);使用文档也没写好;有些亲手写的函数居然忘了是干啥用的了。我甚至连 git 都没开。有些我知道怎么解决但没时间,有些我不知道也不想知道。但这都不是主要的。主要原因我在这里说了,好比生娃,怕养不起,不敢生。不过,这都三年了,连哪吒也该出世了,所以就发出来,我可以解释怎么使用,但实在无力修补维护。欢迎领养,算是给这娃找个好人家。
忘了解释为啥这个包不建议使用 Knit 毛线球。
主要是因为 deepdown 不是 R Markdown 的正规军。正规军是用 knitr 包把 Rmd 文件编成 md 文件,然后带着一群参数列队进入 pandoc 受训;而 deepdown 是用 knitr 包把 Rmd 文件编成 md 文件,然后做一些微调,训成 Markdeep 支持的格式,不涉及 pandoc。这个过程被我打包到了 deepdown::deepdown()
函数里,但是不易跟 Knit 毛线球对接。采取的凑合方案是在 yaml 里添加了一句:
knit: (deepdown::deepdown(rstudioapi::getSourceEditorContext()$path))
来强制毛线球的行为。一般情况下尚可,但是不一般情况下就出现一个 bug:当工作路径 foo/
跟 Rmd 文件的存储路径 bar/
不一致的时候,内嵌代码产生的图片等文件会默认保存在 foo/figure
,而生成的 html 则会在 bar/figure
里寻找图片,那当然找不到。解决方法也简单,只要在 console 运行一句
setwd(dirname(rstudioapi::getSourceEditorContext()$path))
即可。
除此之外,另一个原因是 RStudio Markdown 编辑器的问题。不知从哪个版本开始,这个编辑器会在用户保存 Rmd 文件的一瞬间自动修改 Rmd 文件。比较明显的是无序列表(unnumbered list),会被自动强制添加一些空格。我猜想可能是为了适应可视化编辑器:这种事情在切换 Source 和 Visual 标签时频繁发生。这种自动修改偏偏破坏了 Markdeep 的一些规则,导致日历、ASCII 图等遭到破坏而无法正常显示。我在 RStudio 的设置里没有找到相关选项。使用 RStudio 这么多年,这是我第一次对它产生不满。不过可能是我这个需求太小众了,我也懒得去提 issue,解决方法就是如果需要 Markdeep 的这些华丽功能,那就不要使用 RStudio 编辑器,而是改用别的编辑器,然后使用:
deepdown::deepdown("你的 Rmd 文件路径")
来转换,就可以了。