我想知道是否有一种技巧可以将当前日期放在.rmd文档的YAML前端,由knitr和rmarkdown包处理。我曾经在我的维基页面顶部有这样一行字,
_baptiste, `r format(Sys.time(), "%d %B, %Y")`_
并且它将在html输出中转换为baptiste, 03 May, 2014。现在,我想利用rmarkdown提供的高级pandoc包装器,但在YAML头中有r代码似乎不起作用:
---
title: "Sample Document"
output:
html_document:
toc: true
theme: united
date: `r format(Sys.time(), "%d %B, %Y")`
author: baptiste
---
Error in yaml::yaml.load(front_matter) :
Scanner error: while scanning for the next token at line 6, column 7
found character that cannot start any token at line 6, column 7
Calls: <Anonymous> ... output_format_from_yaml_front_matter ->
parse_yaml_front_matter -> <Anonymous> -> .Call
有解决方案吗?
一种解决方法是使用brew包并将YAML前端内容编写为brew模板。
---
title: "Sample Document"
output:
html_document:
toc: true
theme: united
date: <%= format(Sys.time(), "%d %B, %Y") %>
author: baptiste
---
现在可以使用brew_n_render函数,该函数将使用brew预处理文档,然后通过rmarkdown运行。
brew_n_render <- function(input, ...){
output_file <- gsub("\\.[R|r]md$", ".html", input)
brew::brew(input, 'temp.Rmd'); on.exit(unlink('temp.Rmd'))
rmarkdown::render('temp.Rmd', output_file = output_file)
}
要使用RStudio中的KnitHTML按钮来实现这一点,您可以编写一个自定义输出格式,该格式将自动使用brew作为预处理器。使用brew进行预处理可确保在预处理阶段不影响文档中的knitr代码块。理想情况下,rmarkdown包应该在其API中公开元数据,并允许用户通过自定义函数运行元数据。
我今天被这个咬了。
我有
date: "`r format(Sys.Date(), "%B %d, %Y")`"
并得到了与OP相同的错误,但只是在编织到单词时。在我尝试编织到Word之前,编织到pdf很好。后来也不管用了。
Error in yaml::yaml.load(front_matter) :
Scanner error: while scanning for the next token at line 3, column 31
found character that cannot start any token at line 3, column 31
Calls: <Anonymous> ... output_format_from_yaml_front_matter ->
parse_yaml_front_matter -> <Anonymous> -> .Call`
第31位是第一个%号
将其替换为
date: '`r format(Sys.Date(), "%B %d, %Y")`'
根据MLaVoie的建议,工作很好。
我不知道为什么会发生这种事,我也没有时间去调查报告。