【发布时间】:2017-02-14 13:42:39
【问题描述】:
我有一些 Rmd 文档,除了标题之外,它们都具有相同的 YAML 前题。 我怎样才能将这个 frontmatter 保存在一个文件中并用于所有文档? 它变得相当大,我不想每次调整 frontmatter 时都保持每个文件同步。
我还想要
- 使用 RStudio 中的 Knit 按钮/Ctrl+Shift+K 快捷键进行编译
- 保持整个设置的便携性:希望避免编写自定义输出格式或覆盖
rstudio.markdownToHTML(因为这也需要我随身携带.Rprofile)
示例
common.yaml:
author: me
date: "`r format (Sys.time(), format='%Y-%m-%d %H:%M:%S %z')`"
link-citations: true
reference-section-title: References
# many other options
示例文档
----
title: On the Culinary Preferences of Anthropomorphic Cats
----
I do not like green eggs and ham. I do not like them, Sam I Am!
期望的输出:
已编译的示例文档(即 HTML 或 PDF),已使用注入 common.yaml 中的元数据进行编译。YAML 中的 R 代码(在本例中为日期)将作为奖励进行编译,但它是没有必要(我只在我不需要的日期使用它)。
选项/解决方案?
我还没有完成这些工作。
- 使用 rmarkdown 可以创建一个
_output.yaml来放置常见的 YAML 元数据,但这会将所有元数据放在 YAML 中的output:下,因此仅适用于html_document:和pdf_document:下的选项,而不是对于作者、日期、...等内容。 -
编写一个 knitr 块来导入 YAML,例如
---- title: On the Culinary Preferences of Anthropomorphic Cats ```{r echo=F, results='asis'} cat(readLines('common.yaml'), sep='\n') ``` ---- I do not like green eggs and ham. I do not like them, Sam I Am!如果我
knitr('input.Rmd')然后pandoc输出,则此方法有效,但如果我使用 Rstudio 中的 Knit 按钮(我假设调用render)则无效,因为这会在运行 knitr 之前先解析元数据,然后在运行 knitr 之前元数据格式错误。 - Makefile:如果我足够聪明,我可以编写一个 Makefile 或其他东西将
common.yaml注入input.Rmd,然后运行rmarkdown::render(),并以某种方式将其连接到 Rstudio 的 Knit 按钮,也许以某种方式保存它Rstudio 配置到.Rproj文件中,这样整个东西就可以移植了,我也不需要编辑.Rprofile。但我不够聪明。
EDIT:我尝试了最后一个选项并将 Makefile 连接到 Build 命令(Ctrl+Shift+B)。但是,每次我通过 Ctrl+Shift+B 使用它时,都会构建相同的目标,并且我想构建对应的目标使用我目前在编辑器中打开的 Rmd 文件 [至于 Ctrl+Shift+K]。
【问题讨论】:
-
好问题!由于
`r format(...)`位,.yaml 中的“块”似乎特别成问题——很难知道 R 会如何告诉它应该递归地评估代码。 -
是的,我认为这可能很麻烦。这就是为什么我仍然对不解析
common.yaml中的 R 块的解决方案感到高兴的原因。 -
@hrbrmstr 我已经找到了这个;这是我在我的问题中列为(不是)解决方案的第一件事。
-
@hrbrmstr 我在我的问题中将其列为第三个选项,但如前所述,我还不够聪明(因此提出了这个问题)。我目前正在尝试学习 Makefile 语法,并认为我可以将 Makefile 连接到 Rstudio 的“构建”命令,而不是 Knit,但这不是我的首选。
-
由于 YAML 被转换为
knit/render作为参数,您可能可以在存储的参数列表上调用knitr::opts_knit$set()。或者,只需使用rmarkdown::output_format制作您自己的模板,这可能是明智的做法。
标签: r knitr r-markdown