YAML当前日期在rmarkdown

我想知道是否有一种技巧可以将当前日期放在.rmd文档的YAML前置事项中,由knitrrmarkdown包处理。我曾经在我的维基页面顶部有这样一行字,

   _baptiste, `r format(Sys.time(), "%d %B, %Y")`_

并且它会在html输出中转换为巴蒂斯特,2014年5月3日。现在,我想利用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

有解决方案吗?

117268 次浏览

一个解决方法是使用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中公开元数据,并允许用户通过自定义函数运行它。

这有点棘手,但你只需要通过引用内联R表达式使date字段在YAML中有效,例如。

date: "`r format(Sys.time(), '%d %B, %Y')`"

然后解析错误将消失,日期将在markdown输出中生成,以便Pandoc可以使用Sys.time()中的值。

只是跟进@Yihui的情况。奇怪的是,我发现:

'`r format(Sys.Date(), "%B %d, %Y")`'

比以下情况更有效:

"`r format(Sys.Date(), '%B %d, %Y')`"

对于后者,当在HTML和PDF输出之间切换时,RStudio选择将外部引号更改为',从而破坏了代码。

或者单引号,双引号,反之亦然,这很好。

---
title: "Sample Document"
output:
html_document:
toc: true
theme: united
date: '`r format(Sys.time(), "%d %B, %Y")`'
author: baptiste
---

对于我来说,同样的问题。我用这个代码来解决它。

---
title: "bla bla"
author: "My name"
date: \`r format(Sys.Date(), "%B %d, %Y")`\
output: html_document
---

<强>更新 你也可以使用另一种格式

---
title: "bla bla"
author: "My name"
date: \`r format(Sys.Date(), "%m %d,%Y")`\
output: html_document
---

最好的

或者,可能像下面这样,请参见R Markdown参数化报告

params:
reportDate:
input: date
label: 'Report Date:'
value: as.POSIXct(Sys.Date())
我今天被这个咬了。 我有

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的建议,工作很好。

我不知道为什么会发生这种事,我也没有时间去调查报告。

或者,如果你使用新的格式quarto https://quarto.org。你可以在.qmd文件的yaml头文件中这样做。

——-
title: title of my doc
date: today
format:
html:
theme: default
——-

对于格式化,请检查格式化选项在这里

举个例子,

date: 03/07/2005
date-format: long