2016-11-25 5 views
3

В моем YAML вызова у меня естьПеременная Windows ("% userprofile%") в 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, согласно обновленному названию выше. Я предполагаю, что это, должно быть, конкретная проблема.

+0

Вы должны указать ошибку YAML, которую вы получите для второго ввода. – flyx

+0

Я обновил вопрос @flyx – Andreas

ответ

3

Проблема в том, что параметры в поле output понимают только rmarkdown. Pandoc не понимает их, поэтому вам нужно убедиться, что rmarkdown может оценить выражение. Поскольку rmarkdown использует это YAML пакет для чтения метаданных YAML и YAML синтаксис «s для выражения 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') 
+0

Это работает @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, чем Buch из символы, начинающиеся и заканчивающиеся кадром, никакая интерпретация не должна b e, сделанное с помощью парсера).

+0

Хорошо - спасибо. На данный момент я предполагаю, что это проблема с новичком. – Andreas

+0

YAML полностью разбирается, а затем передается носителю, который ожидает определенный синтаксис, похоже, что он ничего не делает с задними окнами. Сначала я бы скорректировал правильный путь в сканирующем яме YAML без каких-либо обратных запросов, а затем постепенно заменил части на вещи, которые может оценить каждый пользователь, каждый раз проверяя, что он все еще работает. – Anthon

+0

Если я заменил значение заголовка на значение для reference_docx и hardcode вывод вызова в значение reference_docx, в заголовке будет напечатан правильный путь (например: https://i.imgur.com/5JkCVoN. PNG). Поэтому я предполагаю, что это должна быть проблема с ножом. – Andreas