2016-11-25 68 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