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

10

在我的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问题。


你应该提供第二个输入的YAML错误。 - flyx
我已经更新了问题@flyx。 - Andreas
2个回答

11
问题在于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')

2
这个方法在@Yihui那里有效。但是这是否意味着"!expr"取代了"`r"?我可以在yaml包中找到这个文档,但其他地方没有。在我的例子中,"'r"适用于日期字段,但!expr不适用。另一方面,!expr适用于reference_docx,但"'r"不适用?有什么区别? - Andreas
2
好问题。r 语法只能被 knitr 理解。在您的情况下,您希望 rmarkdown 理解它是一个 R 表达式。由于 rmarkdown 使用 yaml 解析 YAML 元数据,而 yaml 只能理解 !expr - Yihui Xie
1
这总是让我困扰。我可以在YAML的日期字段中使用"r Sys.time()",但必须使用!expr path_to_doc.docx来引用模板。knitr + RMd很棒,但对我来说这不直观也不明显。 - Matt Cowgill
1
@MattCowgill 我完全同意你的观点。 - Yihui Xie
1
无论如何,感谢您提供的所有软件包@Yihui,您做出了巨大的贡献。 - Matt Cowgill

0

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

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

该标量:

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

这是正确的YAML格式,不应该出现错误(当然,对于YAML来说,除了以反引号开头和结尾的一堆字符外,解析器不应该对其进行任何解释)。


好的 - 谢谢。目前我认为这是一个knitr问题。 - Andreas
YAML被完全解析,然后交给knitr处理,它期望一定的语法,看起来似乎不会使用反引号。我建议首先在YAML标量中硬编码正确的路径,不使用任何反引号,然后逐步替换为knitr可以评估的内容,每次都检查它是否仍然有效。 - Anthon
如果我将标题值替换为reference_docx的值,并将调用的输出硬编码到reference_docx值中,则正确的路径将在标题中打印(如此:https://i.imgur.com/5JkCVoN.png)。所以我猜这一定是一个knitr问题。 - Andreas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接