在 YAML 中使用 R 代码或 Windows 用户变量(“%userprofile%”)?

Use R code or Windows user variable ("%userprofile%") in YAML?

在我的 yaml 调用中我有

---
title: "`r paste0('Test. Done ', format(Sys.Date(), '%B-%Y'))`"
output:
  word_document:
    fig_caption: yes
    fig_height: 4
    fig_width: 7
    reference_docx: %userprofile%\Documents\template.docx
---

但是 YAML 抱怨 %userprofile%。是否可以包含这样的变量?

我试过,例如

reference_docx: "`r file.path(path.expand('~'), 'skabelon.docx')`"

但这仍然会导致此 YAML 错误。

pandoc.exe: `r file.path(path.expand('~'), 'skabelon.docx')`: openBinaryFile: does not exist (No such file or directory)

我猜这意味着 r 表达式没有在 yaml 之前处理?我已经检查过文件在那里......或者是因为 pandoc 使用另一个 'userprofile' ?我该如何检查?

不过,我可以根据上面更新的标题在 Title 变量中使用这样的调用。我想这一定是一个特定的 knitr 问题。

您可以包含这样一个变量,但您应该引用放置它的标量(单引号或双引号)。在带引号的标量中,% 没有任何特殊含义,只有单引号具有(在单引号字符串中,或​​反斜杠 (\) 在双引号字符串中。

将该标量进一步解释为 Windows 变量超出了 YAML 的范围,需要由您的程序完成。

标量:

"`r file.path(path.expand('~'), 'skabelon.docx')`"

是正确的 YAML,不要抛出错误(当然,对于 YAML 来说,除了一堆以反引号开头和结尾的字符之外别无其他,解析器不应对此进行任何解释)。

问题是 output 字段中的参数只有 rmarkdown 可以理解。 Pandoc 不理解它们,所以你需要确保 rmarkdown 可以计算表达式。由于 rmarkdown 使用 yaml 包来读取 YAML 元数据,并且 yaml 的 R 表达式语法是!expr,可以把R表达式放在!expr之后,例如

output:
  word_document:
    fig_caption: yes
    fig_height: 4
    fig_width: 7
    reference_docx: !expr file.path(Sys.getenv('USERPROFILE'), 'Documents', 'template.docx')