YAML当前日期在rmarkdown

时间:2014-05-03 20:13:30

标签: r yaml knitr r-markdown

我想知道是否有一个技巧可以将当前日期放在由.rmdknitr包处理的rmarkdown文档的YAML前端内容中。我以前在我的维基页面顶部有以下行,

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

它将在html输出中转换为 baptiste,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

任何解决方法?

7 个答案:

答案 0 :(得分:292)

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

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

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

答案 1 :(得分:63)

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

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

效果优于:

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

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

答案 2 :(得分:13)

或者只引用双引号,反之亦然,这很有效。

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

答案 3 :(得分:11)

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

答案 4 :(得分:3)

或者,或许类似于以下内容,请参阅R Markdown Parameterized Reports

params:
  reportDate:
    input: date
    label: 'Report Date:'
    value: as.POSIXct(Sys.Date())

答案 5 :(得分:0)

enter image description here对我来说同样的问题。我用这个代码解决了它。

---
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
---

最佳。

答案 6 :(得分:-1)

我今天被这个咬了。 我有

date: " R□格式(Sys.Date(), “%B%d,%Y”)"

并获得与OP大致相同的错误,但在编织成单词时仅 。针织到PDF被罚款之前,我试图编织到Word。此后,它也不能工作。

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□格式(Sys.Date(), “%B%d,%Y”)'

根据MLaVoie的建议,效果很好。

我不知道为什么会这样,而且我没有时间去挖掘-报告要完成。