Ymark中的YAML当前日期


247

我想知道是否有技巧将当前日期放在.rmd要处理的文档的YAML前端,knitr并且rmarkdown程序包。我以前在Wiki页面的顶部有以下行,

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

它将在html输出中转换为baptiste,20145月3日。现在,我想利用所提供的高级pandoc包装器rmarkdown,但是在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
令我惊讶的是,这不再起作用了,因为这正是我以前所做的。我会看看最近发生了什么。顺便说一句,yaml还支持通过R从R计算的值!expr,例如date: !expr Sys.time(),但现在也不起作用。
Yihui Xie

Answers:


366

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

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

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


我想这意味着内联R不能用于例如列表,includes: after_body: [ ... ]因为有效的YAML只能是文件名字符串...所以没有可能includes: "`r list.files(...)`"
Louis Maddox

1
@Yihui在html输出中对我有效,但在YAML标头中.md则不适用于结果文件keep_md: true。有什么解决办法吗?
Matt SM

7
对于其他美国人:date: "`r format(Sys.time(), '%B %d, %Y')`"
ubomb '16

@Yihui,您好,我在pdf文件中的日期输出出现了乱码。您知道如何解决此问题吗?谢谢。
硬件科学家

2
如果您需要在日期中加点,请记住要逃脱它们并逃脱逃生:r format(Sys.time(), '%d\\\\. %B %Y')
BurninLeo

72

只需关注@Yihui。奇怪的是,我发现:

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

效果优于:

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

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


1
反斜杠是否应该存在?
为什么

4
反斜杠不应该在那里。没有它们,代码将起作用。
rakensi

1
同意 “”对我没有用,但“”对我有用。谢谢!
Leah Wasser

18

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

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

12

一种解决方法是使用该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)
}

要使用KnitHTMLRStudio中的按钮进行此操作,您可以编写自定义输出格式,该格式将自动brew用作预处理程序。使用brew进行预处理可确保knitr在预处理阶段保持文档中的代码块不变。理想情况下,rmarkdown程序包应在其API中公开元数据,并允许用户通过自定义功能运行它。


5
谢谢拉姆纳特,那行得通。最好不要在工作流程中包含多余的步骤和临时文件。以我的经验,该过程越复杂,几个月后可重复性就越差(即我不记得它是如何工作的)。
baptiste 2014年


1

在此处输入图片说明对于我来说同样的问题。我使用此代码解决它。

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

最好。


-1

今天我被这个咬了。我有

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的建议,效果很好。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.