【问题标题】:YAML current date in rmarkdownrmarkdown 中的 YAML 当前日期
【发布时间】:2014-06-20 09:18:55
【问题描述】:

我想知道是否有一个技巧可以将当前日期放在 .rmd 文档的 YAML 前端,以供 knitrrmarkdown 包处理。我曾经在我的 wiki 页面顶部有以下行,

   _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

有什么解决方法吗?

【问题讨论】:

  • 我很惊讶这不再有效,因为这正是我以前所做的。我看看最近发生了什么。顺便说一句,yaml 还支持通过!expr 从 R 计算的值,例如date: !expr Sys.time(),但现在这也不起作用。

标签: r yaml knitr r-markdown


【解决方案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 的建议,工作正常。

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

【讨论】:

    【解决方案2】:

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

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

    最好的。

    【讨论】:

      【解决方案3】:

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

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

      效果优于:

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

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

      【讨论】:

      • 反斜杠应该在那里吗?
      • 不应该有反斜杠。没有它们,代码就可以工作。
      • 同意。 "" 对我不起作用,但 '' 对我有用。谢谢!
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

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

          然后解析错误就会消失,并且日期会在markdown输出中生成,所以Pandoc可以使用来自Sys.time()的值。

          【讨论】:

          • 我猜这意味着内联 R 不能用于例如一个列表includes: after_body: [ ... ] 作为有效的 YAML 只会是文件名字符串...所以includes: "`r list.files(...)`" 的可能性不大?
          • @Yihui 这适用于我的 html 输出,但不适用于生成的 .md 文件,如果我在 YAML 标头中有 keep_md: true。有什么解决办法吗?
          • 对于任何其他美国人:date: "`r format(Sys.time(), '%B %d, %Y')`".
          • 嗨@Yihui,我在pdf文件中的日期输出月份出现乱码。你知道我该如何解决这个问题吗?谢谢。
          • 如果您需要在日期中添加点,请记住将其转义并转义:r format(Sys.time(), '%d\\\\. %B %Y')
          【解决方案7】:

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

          【讨论】:

          • 感谢 Ramnath,这会奏效。最好不要在工作流程中包含额外的步骤和临时文件;根据我的经验,这个过程越复杂,几个月后它的可重复性就越低(即我不记得它是如何工作的)。
          猜你喜欢
          • 1970-01-01
          • 2017-06-20
          • 1970-01-01
          • 1970-01-01
          • 2023-02-08
          • 1970-01-01
          • 2014-10-12
          • 1970-01-01
          • 2020-05-16
          相关资源
          最近更新 更多