Текущая дата 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 работал нормально.

Я понятия не имею, почему это произошло, и у меня нет времени копаться - отчеты заканчиваются.