YAML текущая дата в rmarkdown

171

Мне интересно, если есть трюк, чтобы поместить текущую дату в переднюю часть 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

Любое обходное решение?

  • 5
    Я удивлен, что это больше не работает, так как это именно то, что я делал раньше. Я посмотрю, что происходит в последнее время. Кстати, yaml также поддерживает значения, вычисленные из R с помощью !expr , например date: !expr Sys.time() , но теперь это тоже не работает.
Теги:
r-markdown
yaml
knitr

7 ответов

251
Лучший ответ

Это немного сложно, но вам просто нужно сделать поле date допустимым в YAML, указав выражение inline R, например.

date: "`r format(Sys.time(), '%d %B, %Y')`"

Тогда ошибка синтаксического анализа исчезнет, ​​и дата будет сгенерирована в выводе меток, поэтому Pandoc может использовать значение из Sys.time().

  • 0
    Я предполагаю, что это означает, что встроенный R нельзя использовать, например, список includes: after_body: [ ... ] поскольку действительным YAML будут только строки имени файла ... Так что нет никакой возможности includes: "`r list.files(...)`" ?
  • 1
    @ Yihui это работает для меня в выводе html, но не в .md файле .md если в заголовке YAML есть keep_md: true . Любое решение для этого?
Показать ещё 3 комментария
57

Просто следуйте за @Yihui. Как ни странно, я обнаружил, что:

'`r format(Sys.Date(), "%B %d, %Y")`'

работает лучше, чем:

"`r format(Sys.Date(), '%B %d, %Y')`"

Для последнего RStudio выбирает изменить внешние кавычки на ' при переключении между выходом HTML и PDF и тем самым нарушать код.

  • 1
    Должен ли был быть обратный слеш?
  • 4
    Обратных слешей быть не должно. Без них код работает.
Показать ещё 2 комментария
12

Или просто одинарная кавычка с двойными кавычками и наоборот. Это хорошо работает.

---
title: "Sample Document"
output:
  html_document:
    toc: true
    theme: united
date: '`r format(Sys.time(), "%d %B, %Y")`'
author: baptiste
---
10

Одним из способов решения проблемы является использование пакета 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
    спасибо Рамнатх, это сработает. Было бы хорошо, чтобы в рабочем процессе не было лишних шагов и временных файлов; по моему опыту, чем более запутанен процесс, тем меньше он воспроизводим (т.е. я не могу вспомнить, как он работает) несколько месяцев спустя.
3

или, возможно, что-то вроде следующего, см. R Markdown Parameterized Reports

params:
  reportDate:
    input: date
    label: 'Report Date:'
    value: as.POSIXct(Sys.Date())
0

Я был укушен этим сегодня. я имел

date: " формат r (Sys.Date(),"% B% d,% Y ") "

и получил более или менее ту же ошибку, что и ОП, но только при вязании на слово. Вязание в 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 формат (Sys.Date(), "% B% d,% Y") '

как советовал MLaVoie, работал нормально.

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

0

Изображение 4331 Для этой же проблемы для меня. Я решаю его с помощью этого кода.

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

Бест.

  • 0
    Проверьте свой код еще раз. для меня это работает отлично.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню