วิธีแปลง R Markdown เป็น PDF


127

ผมเคยถามไว้ก่อนหน้านี้เกี่ยวกับคำสั่งสำหรับการแปลง R Markdown เพื่อ HTML

วิธีที่ดีในการแปลงไฟล์ R Markdown เป็นเอกสาร PDF คืออะไร?

ทางออกที่ดีจะรักษาเนื้อหาไว้ให้มากที่สุดเท่าที่จะทำได้ (เช่นรูปภาพสมการตาราง html ฯลฯ ) โซลูชันต้องสามารถเรียกใช้จากบรรทัดคำสั่ง ทางออกที่ดีก็คือการข้ามแพลตฟอร์มและควรลดการอ้างอิงให้น้อยที่สุดเพื่อให้ง่ายต่อการแชร์ไฟล์และอื่น ๆ

โดยเฉพาะมีตัวเลือกมากมาย:

  • ไม่ว่าจะแปลง RMD เป็น MD เป็น HTML เป็น PDF หรือไม่ หรือ RMD เป็น MD เป็น PDF; หรือ RMD เป็น PDF
  • หากใช้markdownแพ็กเกจใน R จะระบุตัวเลือกใด
  • ไม่ว่าจะใช้pandocแพคเกจในตัว R หรืออย่างอื่น

นี่คือตัวอย่างไฟล์ rmdที่สันนิษฐานว่าเป็นการทดสอบที่สมเหตุสมผลของโซลูชันที่เสนอ ถูกใช้เป็นพื้นฐานสำหรับบทความในบล็อกนี้


7
ฉันเชื่อว่า pandoc น่าจะเป็นวิธีที่ดีที่สุด มันไม่สมเหตุสมผลสำหรับฉันที่จะสร้างมันเป็น R และฉันก็ไม่คิดว่ามันจะเป็นไปได้เช่นกัน (เขียนด้วยภาษา Haskell) ฉันมีงานแรก ๆ ที่นี่: github.com/yihui/knitr-book (ดูสองเชลล์สคริปต์knitและmdconvert.sh) อาจเป็นเรื่องยากที่จะกำหนดแนวทางทั่วไปเนื่องจาก LaTeX ยืดหยุ่นเกินไป คุณสามารถใช้เทมเพลตทุกประเภทสำหรับ pandoc
Yihui Xie

'R Markdown * คืออะไร? rstudio.com/ide/docs/r_markdown
พันเอก Panic

markdowntopdf.comเว็บไซต์นี้ค่อนข้างดีจริง อย่างไรก็ตามไม่มีน้ำยางรองรับ
padawan

เราสามารถอัปเดตคำตอบสำหรับ RStudio v1.0 ได้หรือไม่
Adam_G

คำตอบ:


69

คำตอบที่อัปเดต (10 กุมภาพันธ์ 2556)

แพ็คเกจ rmarkdown : ขณะนี้มีrmarkdownแพ็คเกจบน githubที่เชื่อมต่อกับ Pandoc มันมีrenderฟังก์ชัน เอกสารประกอบทำให้ชัดเจนว่าจะแปลง rmarkdown เป็น pdf ในรูปแบบอื่น ๆ ได้อย่างไร ซึ่งรวมถึงรูปแบบเอาต์พุตในไฟล์ rmarkdown หรือการรันการจัดหารูปแบบเอาต์พุตให้กับฟังก์ชัน rend เช่น,

render("input.Rmd", "pdf_document")

บรรทัดคำสั่ง: เมื่อฉันเรียกใช้renderจากบรรทัดคำสั่ง (เช่นใช้ makefile) บางครั้งฉันก็มีปัญหากับการไม่พบ pandoc สันนิษฐานว่าไม่ได้อยู่ในเส้นทางการค้นหา คำตอบต่อไปนี้อธิบายวิธีการเพิ่ม pandoc กับสภาพแวดล้อมการวิจัย

ตัวอย่างเช่นบนคอมพิวเตอร์ของฉันที่ใช้ OSX ซึ่งฉันมีสำเนาของ pandoc ผ่าน RStudio ฉันสามารถใช้สิ่งต่อไปนี้:

Rscript -e "Sys.setenv(RSTUDIO_PANDOC='/Applications/RStudio.app/Contents/MacOS/pandoc');library(rmarkdown);  library(utils); render('input.Rmd', 'pdf_document')"

คำตอบเก่า (ประมาณปี 2555)

ดังนั้นผู้คนจำนวนหนึ่งจึงแนะนำว่า Pandoc คือหนทางที่จะไป ดูหมายเหตุด้านล่างเกี่ยวกับความสำคัญของการมี Pandoc เวอร์ชันล่าสุด

ใช้ Pandoc

ฉันใช้คำสั่งต่อไปนี้เพื่อแปลง R Markdown เป็น HTML (เช่นตัวแปรของ makefile นี้ ) โดยที่RMDFILEชื่อของไฟล์ R Markdown ไม่มี.rmdส่วนประกอบ (สมมติว่านามสกุลเป็น.rmdและไม่ใช่.Rmd)

RMDFILE=example-r-markdown  
Rscript -e "require(knitr); require(markdown); knit('$RMDFILE.rmd', '$RMDFILE.md'); markdownToHTML('$RMDFILE.md', '$RMDFILE.html', options=c('use_xhml'))"

จากนั้นคำสั่งนี้เพื่อแปลงเป็น pdf

Pandoc -s example-r-markdown.html -o example-r-markdown.pdf


ข้อสังเกตบางประการเกี่ยวกับสิ่งนี้:

  • ฉันลบการอ้างอิงในไฟล์ตัวอย่างซึ่งเอ็กซ์พอร์ตแปลงไปยัง imgur เพื่อโฮสต์รูปภาพ
  • ฉันลบการอ้างอิงถึงรูปภาพที่โฮสต์บน imgur ดูเหมือนว่าตัวเลขจะต้องเป็นของท้องถิ่น
  • ตัวเลือกในmarkdownToHTMLฟังก์ชันนี้หมายความว่าการอ้างอิงรูปภาพเป็นไฟล์และไม่ใช่ข้อมูลที่จัดเก็บในไฟล์ HTML (เช่นฉันลบออก'base64_images'จากรายการตัวเลือก)
  • ส่งผลให้การส่งออกดูเหมือนนี้ มันได้สร้างเอกสารสไตล์ LaTeX อย่างชัดเจนซึ่งตรงกันข้ามกับสิ่งที่ฉันได้รับหากฉันพิมพ์ไฟล์ HTML เป็น pdf จากเบราว์เซอร์

รับ Pandoc เวอร์ชันล่าสุด

ดังที่ได้กล่าวไว้โดย @daroczig สิ่งสำคัญคือต้องมี Pandoc เวอร์ชันล่าสุดเพื่อส่งออกไฟล์ PDF ใน Ubuntu เมื่อวันที่ 15 มิถุนายน 2555 ฉันติดอยู่กับ Pandoc เวอร์ชัน 1.8.1 ในตัวจัดการแพ็คเกจ แต่ดูเหมือนว่าจากบันทึกการเปลี่ยนแปลงที่รองรับ pdf คุณต้องใช้ Pandoc เวอร์ชัน 1.9 ขึ้นไปเป็นอย่างน้อย

caball-installดังนั้นผมติดตั้ง แล้ววิ่ง:

cabal update
cabal install pandoc

Pandoc ได้รับการติดตั้งใน~/.cabal/bin/pandoc ดังนั้นเมื่อฉันรันpandocมันก็ยังคงเห็นเวอร์ชันเก่าอยู่ ดูที่นี่สำหรับการเพิ่มเส้นทาง


5
ขอบคุณสำหรับคำตอบนี้ ฉันแค่อยากจะแสดงความคิดเห็นว่าประสบการณ์ของฉันคือการให้ไฟล์. mdกับpandocแทนที่จะเป็นไฟล์. html นั้นให้ผลลัพธ์ที่ดีกว่า ดังนั้นจึงคุ้มค่าที่จะทดลอง
yoavram

นี่เป็นสิ่งที่ใกล้เคียงที่สุดที่ฉันได้มาในกระบวนการที่ดีเช่นกัน มีวิธีใดในการเปลี่ยนข้อความจาก "พล็อตเรื่อง ... " เป็นอย่างอื่นหรือไม่?
svenski

1
pandocอยู่ในเวอร์ชัน 1.12 แม้ใน Ubuntu 13.04 ที่ล้าสมัยในขณะนี้
krlmlr

22

ฉันคิดว่าคุณต้องการpandocจริงๆซึ่งซอฟต์แวร์ที่ยอดเยี่ยมได้รับการออกแบบและสร้างขึ้นเพื่องานนี้เท่านั้น :) นอกจากpdfแล้วคุณยังสามารถแปลงไฟล์mdของคุณเป็นdocxหรือodtท่ามกลางคนอื่น ๆ

การติดตั้ง Pandoc เวอร์ชันล่าสุดอาจทำให้เกิดความสับสนบน Linux (เนื่องจากคุณต้องการhaskell-platformสร้างทั้งหมดจากแหล่งที่มา) แต่ทำได้ง่ายมากบน Windows / Mac ด้วยการดาวน์โหลดเพียงไม่กี่เมกะไบต์

หากคุณมีไฟล์ markdown ที่ชง / ถักคุณสามารถเรียกได้pandocเช่น bash หรือด้วยsystemฟังก์ชั่นภายใน R. การสาธิต POC ของหลังนั้นถูกนำไปใช้ในṖandoc.convertฟังก์ชั่นของแพ็คเกจเล็ก ๆ ของฉัน ( ซึ่งคุณต้องเบื่ออย่างมากเมื่อฉันพยายาม ชี้ความสนใจของคุณในทุกโอกาส )


+1 ฟังก์ชั่นดูดี คุณมีคำสั่ง pandoc แบบซับเดียวที่แนะนำสำหรับการแปลง R Markdown เป็น PDF หรือไม่?
Jeromy Anglim

1
การเพิ่ม--tocจะมีประโยชน์ในบรรทัดคำสั่ง (ส่งผลให้ตารางเนื้อหาตามหัวข้อของคุณ) และการปรับแต่งเทมเพลต LaTeX ตามความต้องการของคุณ (เช่นการเพิ่มที่นั่น\listoffiguresและ / หรือ\listoftablesอื่น ๆ ) อาจทำให้ได้เอกสารที่ยอดเยี่ยม
daroczig

3
สิ่งที่ท้าทายapt-get install pandoc?
sumid

@sumid คุณอาจพลาดส่วนที่เป็นปัจจุบัน (ถ้าคุณไม่ได้ใช้การทดสอบ)
daroczig

ใช่คุณพูดถูก - สองครั้ง ฉันพลาดไปแล้วและฉันก็ใช้การทดสอบด้วย ;-) จากนั้นฉันก็รับรู้ว่าเป็นการง่ายกว่าชั่วคราวที่อนุญาตให้ทำการทดสอบsources.listและทำการapt-get install -t testing pandocติดตั้งhaskell-platformและคอมไพล์ (โดยปกติฉันใช้การทดลองฉันหวังว่าจะได้ผลเช่นเดียวกันในการทดสอบ)
sumid

14

ตอนนี้ (สิงหาคม 2014) คุณสามารถใช้RStudioเพื่อแปลง R Markdown เป็น PDF ได้ โดยทั่วไป RStudio ใช้pandocเพื่อแปลง Rmd เป็น PDF

คุณสามารถเปลี่ยนข้อมูลเมตาเป็น:

  1. เพิ่มสารบัญ
  2. เปลี่ยนตัวเลือกรูป
  3. เปลี่ยนรูปแบบการเน้นไวยากรณ์
  4. เพิ่มตัวเลือก LaTeX
  5. และอื่น ๆ อีกมากมาย...

สำหรับรายละเอียดเพิ่มเติม - http://rmarkdown.rstudio.com/pdf_document_format.htmlป้อนคำอธิบายภาพที่นี่


1
ตัวเลือก 'knit PDF' ไม่มีใน Ubuntu 14.04, pandoc v1.17.1 ต้องทำการตั้งค่าใด ๆ หรือไม่?
Prradep

คุณมี RStudio รุ่นใด คุณสร้างไฟล์ rmarkdown ใหม่หรือไม่?
eN

Rstudio - v 0.98.507
Prradep

ขอให้เรายังคงอภิปรายนี้ในการแชท
Prradep

@Prradep ผลของการสนทนาคืออะไร?
nealmcb

10

สำหรับตัวเลือกที่ดูเหมือนสิ่งที่คุณจะได้รับมากขึ้นเมื่อคุณพิมพ์จากเบราว์เซอร์wkhtmltopdfให้ตัวเลือกหนึ่ง

บน Ubuntu

sudo apt-get install wkhtmltopdf

จากนั้นคำสั่งเดียวกับตัวอย่าง pandoc เพื่อไปที่ HTML:

RMDFILE=example-r-markdown  
Rscript -e "require(knitr); require(markdown); knit('$RMDFILE.rmd', '$RMDFILE.md'); markdownToHTML('$RMDFILE.md', '$RMDFILE.html', options=c('use_xhml'))"

แล้ว

wkhtmltopdf example-r-markdown.html example-r-markdown.pdf

แฟ้มผลดูเหมือนนี้ ดูเหมือนว่าจะไม่สามารถจัดการกับ MathJax ได้ ( มีการกล่าวถึงปัญหานี้ที่นี่ ) และการแบ่งหน้าก็น่าเกลียด อย่างไรก็ตามในบางกรณีสไตล์ดังกล่าวอาจเป็นที่ต้องการมากกว่าการนำเสนอสไตล์ LaTeX


ฉันไม่สามารถเรียกใช้คำสั่งสุดท้ายใน RStudio ฉันได้ลองใช้ system("wkhtmltopdf temp.html temp.pdf") ความคิดแล้วว่าจะแก้ไขอย่างไร
Urvah Shabbir

9

เพียงสองขั้นตอน:

  1. ติดตั้ง "pandoc" รุ่นล่าสุดจากที่นี่:

    https://github.com/jgm/pandoc/releases

  2. เรียกใช้ฟังก์ชันpandocในไฟล์library(knitr)

    library(knitr)
    pandoc('input.md', format = 'latex')
    

ดังนั้นคุณสามารถแปลง "input.md" ของคุณเป็น "input.pdf"


3

ฉันพบว่าการใช้ R studio เป็นวิธีที่ง่ายที่สุด แต่ถ้าต้องการควบคุมจากบรรทัดคำสั่งสคริปต์ R ธรรมดาสามารถทำเคล็ดลับโดยใช้คำสั่งrmarkdown render (ดังที่กล่าวไว้ข้างต้น) รายละเอียดสคริปต์ทั้งหมดที่นี่

#!/usr/bin/env R

# Render R markdown to PDF.
# Invoke with:
# > R -q -f make.R --args my_report.Rmd

# load packages
require(rmarkdown)

# require a parameter naming file to render
if (length(args) == 0) {
    stop("Error: missing file operand", call. = TRUE)
} else {
    # read report to render from command line
    for (rmd in commandArgs(trailingOnly = TRUE)) {
        # render Rmd to PDF
        if ( grepl("\\.Rmd$", rmd) && file.exists(rmd)) {
            render(rmd, pdf_document())
        } else {
            print(paste("Ignoring: ", rmd))
        }
    }
}

0

หากคุณไม่ต้องการติดตั้งสิ่งใดคุณสามารถส่งออก html จากนั้นเปิดไฟล์ html - ควรเปิดในหน้าต่างเบราว์เซอร์จากนั้นคลิกขวาเพื่อพิมพ์ ในหน้าต่างการพิมพ์ให้เลือก "บันทึกเป็น pdf" ที่มุมล่างขวามือหากคุณใช้ Mac Voila!


0

ทำตามขั้นตอนง่ายๆเหล่านี้:

1: ในสคริปต์ Rmarkdown ให้รัน Knit (Ctrl + Shift + K) 2: จากนั้นหลังจากเปิดมาร์กดาวน์ html แล้วให้คลิกเปิดในเบราว์เซอร์ (ด้านซ้ายบน) และ html จะเปิดในเว็บเบราว์เซอร์ของคุณ 3: จากนั้นใช้ Ctrl + P และ บันทึกเป็น PDF

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