R Markdown、Knitr、Pandoc和Bookdown之间的关系

123

R Markdown、Knitr、Pandoc和Bookdown之间有什么关系?

具体来说,在将带有嵌入式R代码的标记文档(例如.Rnw或.Rmd)转换为最终输出(例如.pdf或.html)时,这些软件包之间有何“分工”?如果使用Knitr处理RMarkdown,则rmarkdown软件包是做什么的,它与markdown软件包有什么区别?

1个回答

189

Pandoc

Pandoc是一个文档转换器。它可以将许多不同的标记格式转换为其他许多格式,例如.doc.pdf等。

Pandoc是一个没有GUI的命令行工具。它是一个独立的软件,与R分开。然而,它随R Studio捆绑安装,因为rmarkdown依赖它进行文档转换。

Pandoc不仅可以转换文档,还可以在基本的markdown语言之上添加功能,以使其支持更复杂的输出。

R Markdown

R Markdown基于markdown:

Markdown(标记语言)

Markdown是一种轻量级标记语言,具有纯文本格式化语法,设计成可以转换为HTML和许多其他格式。Markdown文件是通常带有扩展名.md的纯文本文件。

像其他标记语言(如HTML和Latex)一样,它完全独立于R。

没有明确定义的Markdown标准。这导致了碎片化,因为不同的供应商编写自己的语言变体以纠正缺陷或添加缺失的功能。

Markdown(R包)

markdown是将.Rmd文件转换为HTML的R包。它是rmarkdown的前身,后者提供了更多功能。不再建议使用。

R Markdown(标记语言)

R Markdown是markdown语法的扩展。R Markdown文件是通常具有文件扩展名.Rmd的纯文本文件。它们使用markdown语法的扩展编写,以便R代码可以嵌入其中,并以稍后可执行的方式进行执行。

因为它们预计会被包处理,因此可以在R markdown文件中使用Pandoc markdown语法。这是原始markdown语法的扩展,提供了额外的功能,如原始HTML/Latex和表格。

R Markdown(包)

R包是一个库,将.Rmd文件转换为多种不同格式。
核心函数是rmarkdown::render,该函数依赖于pandoc。该函数将输入文件呈现为指定的输出格式,使用pandoc。如果输入需要编织,则在pandoc之前调用knitr::knit RMarkdown包旨在提供合理的默认值和友好的R界面以自定义Pandoc选项。 在RMarkdown文件顶部看到的YAML元数据是特定于向rmarkdown::render传递选项,以指导构建过程。
请注意,RMarkdown仅处理markdown语法。如果要转换.Rhtml.Rnw文件,应使用内置于Knitr的便利函数,例如knitr::knit2htmlknitr:knit2pdf

Knitr

Knitr采用嵌入式代码的纯文本文档,执行代码并将结果'编织'回文档中。
例如,它将

核心函数是 knitr::knit,默认情况下它会检查输入文档并尝试猜测其类型 - Rnw、Rmd 等。

这个核心函数执行三个角色: - 源代码解析器,它查看输入文档并检测哪些部分是用户希望被评估的代码。 - 代码评估器,它评估这段代码。 - 输出呈现器,在格式可解释原始输出类型的文档中编写代码评估结果。例如,如果输入文件是一个 .Rmd,输出呈现器会以 .md 格式标记代码评估的输出。

文档格式之间的转换

Knitr 不会 在文档格式之间进行转换 - 例如将一个 .md 转换为 .html。然而,它提供了一些方便的函数来帮助你使用其他库来完成这个工作。如果你正在使用 rmarkdown 包,你应该忽略这个功能,因为它已经被 rmarkdown::render 取代了。

一个例子是knitr:knit2pdf,它将:"编织输入的Rnw或Rrst文档,并使用texi2pdf或rst2pdf编译为PDF。" 一个可能令人困惑的来源是knitr::knit2html,它“是一个方便的函数,用于编织输入的Markdown源代码并调用markdown::markdownToHTML将结果转换为HTML。”。这是现已过时的功能,因为 markdown 包已被rmarkdown包取代。请参见此注释

Bookdown

bookdown软件包建立在R Markdown之上,继承了Markdown语法的简单性以及多种输出格式(PDF / HTML / Word / ...)的可能性。

它提供了一些功能,如多页HTML输出、编号和交叉引用图表/表格/部分/等式,插入部分/附录,并导入了GitBook风格(https://www.gitbook.com)来创建优雅而引人注目的HTML书籍页面。


2
我发现这很令人困惑,所以我尽力了。如果我有错,请编辑或提供不同的答案... - RobinL
7
我觉得有点难懂的一点是每个工具链步骤中传递参数的文档化。几乎没有交互式帮助(例如自动完成),我们必须猜测应该在yaml标题、通过knitr_opts(我总是忘记它叫什么)、通过自定义pandoc参数、通过额外的yam文件或自定义pandoc模板中调用哪些参数...有时候感觉像是走进了一片丛林,特别是当你将LaTeX添加到链条中时。 - baptiste
4
我完全同意@baptiste的观点。这正是我更喜欢使用纯LaTeX编写RNW文档的原因。没有中间的“pandoc”步骤,更少的魔法,更少的混乱。只需克服一开始陡峭的LaTeX学习曲线即可。在我看来,当您满意于简单默认设置时,Rmarkdown非常好用。但一旦需要微调,复杂度就会迅速上升。 - CL.
5
这是我找到的最好的解释。对于初学者或像我一样有多年R和latex分开经验的人来说,这非常令人困惑。优秀的文章。 - StatsStudent
3
@StatsStudent我认为之前版本的rstudio rmarkdown备忘单上有一个图表,对于理解从rmarkdown创建输出的不同步骤非常有帮助。也许这里的答案需要一个图表? - Mark Neal
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接