Поточна дата YAML в rmarkdown


247

Мені цікаво, чи є хитрість укласти поточну дату в передній частині YAML .rmdдокумента, який буде оброблений, knitrі rmarkdownпакета. У мене був такий рядок у верхній частині моїх сторінок вікі,

   _baptiste, `r format(Sys.time(), "%d %B, %Y")`_

і це буде перетворено на баптист, 03 травня 2014 року у вихідному форматі html. Тепер я хотів би скористатися розширеною обгорткою Pandoc, наданою компанією rmarkdownR, але, маючи 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

Будь-яке вирішення?


7
Я здивований, що це більше не працює, адже саме це я і робив. Я побачу, що відбувалося нещодавно. BTW, yaml також підтримує значення, обчислені з R через !expr, наприклад date: !expr Sys.time(), але зараз це також не працює.
Yihui Xie

Відповіді:


366

Це трохи хитро, але вам просто потрібно зробити dateполе дійсним у YAML, цитуючи вбудований R вираз, наприклад

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

Тоді помилка розбору буде відсутня, і дата буде сформована у відмітці, щоб Pandoc міг використовувати значення з Sys.time().


Я думаю, що це означає, що вбудований R не може бути використаний, наприклад, для списку includes: after_body: [ ... ]як дійсного YAML будуть лише рядки імен файлів ... Так що немає можливості includes: "`r list.files(...)`"?
Луї Маддокс

1
@Yihui це працює для мене у виведенні html, але не в отриманому .mdфайлі, якщо я маю keep_md: trueв заголовку YAML. Будь-яке рішення для цього?
Метт СМ

7
Для будь-яких інших американців: date: "`r format(Sys.time(), '%B %d, %Y')`".
ubomb

Привіт @Yihui, я отримав урізаний місяць у даті виведення у файлі pdf. Чи маєте ви якесь уявлення, як я можу вирішити це питання? Дякую.
HW-Scientist

2
Якщо вам потрібна крапка в даті, майте на увазі, щоб уникнути їх і втекти від втечі:r format(Sys.time(), '%d\\\\. %B %Y')
BurninLeo

72

Просто слідкуйте за @Yihui. Як не дивно, я виявив, що:

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

працює краще, ніж:

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

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


1
Невже зворотний нахил мав бути там?
Cwhy

4
Зворотних нахилів не повинно бути там. Без них код працює.
rakensi

1
домовились. "" не працювало для мене, але "" було. спасибі!
Лія Васер

18

Або просто одинарна цитата подвійних цитат і навпаки. Це добре працює.

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

12

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


1

введіть тут опис зображенняЗ тієї ж проблеми для мене. Я вирішую це за допомогою цього коду.

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

Найкраще.


-1

Мене сьогодні це вкусило. я мав

date: "`r format(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 format(Sys.Date(), "%B %d, %Y")`'

як радив MLaVoie, працював чудово.

Я поняття не маю, чому це сталося, і я не встигаю копатись - доводить до кінця.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.