วันที่ปัจจุบันของ YAML อยู่ใน rmarkdown


247

ฉันสงสัยว่ามีเคล็ดลับที่จะนำวันที่ปัจจุบันมาใช้ในส่วนหน้าของ 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

วิธีแก้ปัญหาใด ๆ


7
ฉันประหลาดใจที่ไม่สามารถใช้งานได้อีกต่อไปเนื่องจากนี่คือสิ่งที่ฉันเคยทำ ฉันจะเห็นสิ่งที่เกิดขึ้นเมื่อเร็ว ๆ นี้ BTW, yaml ยังรองรับค่าที่คำนวณจาก R ผ่าน!exprเช่นdate: !expr Sys.time()กัน แต่ตอนนี้มันไม่ทำงานเช่นกัน
Yihui Xie

คำตอบ:


366

นี่เป็นเรื่องยุ่งยากเล็กน้อย แต่คุณเพียงแค่ต้องทำให้dateฟิลด์ใช้งานได้ใน YAML โดยการอ้างถึงการแสดงออกแบบอินไลน์ R เช่น

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

จากนั้นข้อผิดพลาดในการวิเคราะห์คำจะหายไปและวันที่จะถูกสร้างขึ้นในเอาต์พุต markdown เพื่อให้ Pandoc สามารถใช้ค่าSys.time()ได้


ฉันเดาว่านี่หมายความว่าไม่สามารถใช้ inline R สำหรับรายการincludes: after_body: [ ... ]เช่น YAML ที่ถูกต้องจะเป็นชื่อไฟล์สตริงเท่านั้น ... ดังนั้นจึงไม่มีความเป็นไปได้includes: "`r list.files(...)`"?
Louis Maddox

1
@Yihui ใช้งานได้กับฉันในเอาต์พุต html แต่ไม่ได้อยู่ใน.mdไฟล์ผลลัพธ์หากฉันมีkeep_md: trueในส่วนหัว YAML มีทางออกสำหรับเรื่องนี้ไหม?
Matt SM

7
สำหรับชาวอเมริกันอื่น ๆ : date: "`r format(Sys.time(), '%B %d, %Y')`".
ubomb

สวัสดี @Yihui ฉันได้รับเดือนที่อ่านไม่ออกในไฟล์ pdf คุณมีความคิดใด ๆ ว่าฉันจะแก้ปัญหานี้ได้อย่างไร? ขอบคุณ.
นักวิทยาศาสตร์ HW

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
ตกลง "" ไม่ได้ผลสำหรับฉัน แต่ใช้ไม่ได้ ขอบคุณ!
Leah Wasser

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ฟังก์ชั่นที่จะ preprocess doc ใช้และจากนั้นก็วิ่งผ่านbrewrmarkdown

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
ขอบคุณ Ramnath ที่จะทำงาน มันจะดีถ้าไม่มีขั้นตอนพิเศษและไฟล์ temp ในเวิร์กโฟลว์ จากประสบการณ์ของฉันยิ่งกระบวนการที่ซับซ้อนมากขึ้นเท่าไหร่มันก็สามารถทำซ้ำได้น้อยลง (เช่นฉันจำไม่ได้ว่ามันทำงานอย่างไร) ไม่กี่เดือนต่อมา
baptiste


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")`"

และมีข้อผิดพลาดเดียวกับ 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 ทำงานได้ดี

ฉันไม่รู้ว่าทำไมสิ่งนี้จึงเกิดขึ้นและฉันไม่มีเวลาไปขุด - รายงานให้เสร็จ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.