2016-11-25 106 views
3

在我YAML呼叫我有yaml中的Windows变量(“%userprofile%”)?

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

我猜这个表达式在yaml之前没有被处理过吗?我检查过该文件是否存在...或者是否因为pandoc正在使用另一个'userprofile'?我该如何检查?

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

+0

您应该为第二个输入提供YAML错误。 – flyx

+0

我已更新问题@flyx – Andreas

回答

3

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

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

This Works @Yihui。但这是否意味着“!expr”取代“r”?我可以在yaml包中找到这种记录 - 但不在其他地方。在我的例子中,“'r”适用于日期字段,但!expr不适用。另一方面 !expr适用于reference_docx,但“'r”不适用?有什么不同? – Andreas

+0

好问题。 'r'语法只能由knitr理解。在你的情况下,你想让rmarkdown了解它是一个R表达式。由于rmarkdown使用yaml来分析YAML元数据,并且yaml只能理解'!expr'。 –

0

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

是标量的任何进一步的解释与Windows变量超出YAML的范围,需要通过程序来完成

标量:

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

是正确的YAML和呼喊不会引发错误(当然是没有别的YAML比的布赫以反引号开始和结尾的字符,没有解释应该b由解析器完成)。

+0

好的 - 谢谢。现在我假设它是一个针织问题 – Andreas

+0

YAML被完全解析,然后交给knitr,它希望某种语法看起来好像对反引号没有任何作用。我首先在没有任何反引号的情况下对YAML标量中的正确路径进行硬编码,然后逐步用knitr可以评估的东西替换部件,每次检查它仍然有效。 – Anthon

+0

如果我将标题值替换为reference_docx的值,并将调用的输出硬编码为reference_docx值,则会在标题中打印正确的路径(如下所示:https://i.imgur.com/5JkCVoN。 PNG)。所以我想这一定是一个棘手的问题。 – Andreas