Текущая дата YAML в rmarkdown
Мне интересно, если есть трюк, чтобы поместить текущую дату в переднюю часть YAML документа .rmd
, который будет обрабатываться knitr
и пакетом rmarkdown
. Раньше у меня была следующая строка вверху моих страниц wiki,
_baptiste, `r format(Sys.time(), "%d %B, %Y")`_
и он будет преобразован в baptiste, 03 мая 2014 года в выход html. Теперь я хотел бы воспользоваться расширенной оболочкой pandoc, предоставляемой rmarkdown
, но наличие r-кода в заголовке YAML не работает:
---
title: "Sample Document"
output:
html_document:
toc: true
theme: united
date: `r format(Sys.time(), "%d %B, %Y")`
author: baptiste
---
Error in yaml::yaml.load(front_matter) :
Scanner error: while scanning for the next token at line 6, column 7
found character that cannot start any token at line 6, column 7
Calls: <Anonymous> ... output_format_from_yaml_front_matter ->
parse_yaml_front_matter -> <Anonymous> -> .Call
Любое обходное решение?
Ответы
Ответ 1
Это немного сложно, но вам просто нужно сделать поле date
допустимым в YAML, указав выражение inline R, например.
date: "`r format(Sys.time(), '%d %B, %Y')`"
Тогда ошибка синтаксического анализа исчезнет, и дата будет сгенерирована в выводе меток, поэтому Pandoc может использовать значение из Sys.time()
.
Ответ 2
Просто следуйте за @Yihui. Как ни странно, я обнаружил, что:
'`r format(Sys.Date(), "%B %d, %Y")`'
работает лучше, чем:
"`r format(Sys.Date(), '%B %d, %Y')`"
Для последнего RStudio выбирает изменить внешние кавычки на '
при переключении между выходом HTML и PDF и тем самым нарушать код.
Ответ 3
Или просто одинарная кавычка с двойными кавычками и наоборот. Это хорошо работает.
---
title: "Sample Document"
output:
html_document:
toc: true
theme: united
date: '`r format(Sys.time(), "%d %B, %Y")`'
author: baptiste
---
Ответ 4
Одним из способов решения проблемы является использование пакета brew
и запись вашего первого элемента YAML в качестве шаблона brew
.
---
title: "Sample Document"
output:
html_document:
toc: true
theme: united
date: <%= format(Sys.time(), "%d %B, %Y") %>
author: baptiste
---
Теперь вы можете использовать функцию brew_n_render
, которая будет препроцитировать документ с помощью brew
, а затем запустить через rmarkdown
.
brew_n_render <- function(input, ...){
output_file <- gsub("\\.[R|r]md$", ".html", input)
brew::brew(input, 'temp.Rmd'); on.exit(unlink('temp.Rmd'))
rmarkdown::render('temp.Rmd', output_file = output_file)
}
Чтобы сделать это с помощью кнопки KnitHTML
в RStudio, вы можете написать настраиваемый формат вывода, который автоматически будет использовать brew
в качестве препроцессора. Использование brew
для предварительной обработки гарантирует, что фрагменты кода knitr
в вашем документе не затронуты на этапе предварительной обработки. В идеале пакет rmarkdown
должен показывать метаданные в своем API и разрешать пользователям запускать его через пользовательскую функцию.
Ответ 5
или, возможно, что-то вроде следующего, см. R Markdown Parameterized Reports
params:
reportDate:
input: date
label: 'Report Date:'
value: as.POSIXct(Sys.Date())
Ответ 6
Для этой же проблемы для меня. Я решаю его с помощью этого кода.
---
title: "bla bla"
author: "My name"
date: \`r format(Sys.Date(), "%B %d, %Y")`\
output: html_document
---
Обновление
Вы также можете использовать другой формат.
---
title: "bla bla"
author: "My name"
date: \`r format(Sys.Date(), "%m %d,%Y")`\
output: html_document
---
Бест.
Ответ 7
Я был укушен этим сегодня.
У меня был
date: "'r format(Sys.Date(), "%B %d, %Y")'"
и получил более или менее ту же ошибку, что и OP, но только при вязании на слово. Вязание в PDF было хорошо, прежде чем я пытался вязать в Word. Впоследствии это тоже не сработало.
Error in yaml::yaml.load(front_matter) :
Scanner error: while scanning for the next token at line 3, column 31
found character that cannot start any token at line 3, column 31
Calls: <Anonymous> ... output_format_from_yaml_front_matter ->
parse_yaml_front_matter -> <Anonymous> -> .Call'
Позиция 31 - первый знак%
Заменить это на
date: ''r format(Sys.Date(), "%B %d, %Y")''
по совету MLaVoie работал нормально.
Я понятия не имею, почему это произошло, и у меня нет времени копаться - отчеты заканчиваются.