Bagaimana cara mengonversi R Markdown ke PDF?

127

Saya sebelumnya pernah bertanya tentang perintah untuk mengubah R Markdown ke HTML .

Apa cara yang baik untuk mengonversi file R Markdown ke dokumen PDF?

Solusi yang baik akan mempertahankan sebanyak mungkin konten (misalnya, gambar, persamaan, tabel html, dll.). Solusinya harus dapat dijalankan dari baris perintah. Solusi yang baik juga akan lintas-platform, dan idealnya meminimalkan ketergantungan untuk membuatnya lebih mudah untuk berbagi file makefiles dan sebagainya.

Secara khusus, ada banyak opsi:

  • Apakah akan mengkonversi RMD ke MD ke HTML ke PDF; atau RMD ke MD ke PDF; atau RMD ke PDF
  • Jika menggunakan markdownpaket dalam R, opsi mana yang ditentukan
  • Apakah akan digunakan pandoc, paket bawaan ke R, atau yang lain

Berikut adalah contoh file rmd yang mungkin memberikan tes yang masuk akal dari setiap solusi yang diusulkan. Itu digunakan sebagai dasar untuk posting blog ini .

Jeromy Anglim
sumber
7
Saya percaya pandoc harus menjadi cara terbaik untuk pergi. Tidak masuk akal bagi saya untuk membangunnya menjadi R, dan saya juga berpikir itu tidak mungkin (ditulis dalam Haskell). Saya memiliki beberapa pekerjaan awal di sini: github.com/yihui/knitr-book (lihat dua skrip shell knitdan mdconvert.sh). Mungkin sulit untuk melakukan pendekatan umum karena LaTeX terlalu fleksibel; Anda dapat menggunakan semua jenis template untuk pandoc.
Yihui Xie
Apa itu 'R Markdown *? rstudio.com/ide/docs/r_markdown
Kolonel Panic
markdowntopdf.com situs ini sebenarnya cukup bagus. Namun, tidak ada dukungan lateks
padawan
Bisakah kita memperbarui jawaban ini untuk RStudio v1.0?
Adam_G

Jawaban:

69

Jawaban Diperbarui (10 Feb 2013)

paket rmarkdown : Sekarang ada rmarkdownpaket yang tersedia di github yang berinteraksi dengan Pandoc. Ini termasuk renderfungsi. Dokumentasi membuatnya cukup jelas bagaimana mengkonversi rmarkdown ke pdf di antara berbagai format lainnya. Ini termasuk termasuk format output dalam file rmarkdown atau menjalankan memasok format output ke fungsi rend. Misalnya,

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

Command-line: Ketika saya menjalankan renderdari command-line (mis., Menggunakan makefile), saya terkadang memiliki masalah dengan pandoc yang tidak ditemukan. Agaknya, itu tidak di jalur pencarian. Jawaban berikut menjelaskan cara menambahkan Pandoc untuk lingkungan R .

Jadi misalnya, di komputer saya yang menjalankan OSX, di mana saya memiliki salinan pandoc melalui RStudio, saya dapat menggunakan yang berikut ini:

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

Jawaban Lama (sekitar 2012)

Jadi, sejumlah orang menyarankan bahwa Pandoc adalah jalan yang harus ditempuh. Lihat catatan di bawah tentang pentingnya memiliki Pandoc versi terbaru.

Menggunakan Pandoc

Saya menggunakan perintah berikut untuk mengkonversi R Markdown ke HTML (yaitu, varian dari makefile ini ), di mana RMDFILEadalah nama file R Markdown tanpa .rmdkomponen (itu juga mengasumsikan bahwa ekstensi itu .rmddan tidak .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'))"

dan kemudian perintah ini untuk dikonversi ke pdf

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


Beberapa catatan tentang ini:

  • Saya menghapus referensi dalam file contoh yang mengekspor plot ke imgur ke host gambar.
  • Saya menghapus referensi ke gambar yang di-host di imgur. Angka tampaknya harus lokal.
  • Opsi dalam markdownToHTMLfungsi berarti bahwa referensi gambar adalah file dan bukan data yang disimpan dalam file HTML (yaitu, saya dihapus 'base64_images'dari daftar opsi).
  • Output yang dihasilkan tampak seperti ini . Jelas telah membuat dokumen gaya sangat LaTeX berbeda dengan apa yang saya dapatkan jika saya mencetak file HTML ke pdf dari browser.

Mendapatkan Pandoc versi terbaru

Seperti yang disebutkan oleh @daroczig, penting untuk memiliki Pandoc versi terbaru untuk menghasilkan pdf. Di Ubuntu pada 15 Juni 2012, saya terjebak dengan Pandoc versi 1.8.1 di manajer paket, tetapi tampaknya dari log perubahan bahwa untuk dukungan pdf Anda memerlukan setidaknya versi 1.9+ dari Pandoc.

Jadi, saya instal caball-install. Dan kemudian berlari:

cabal update
cabal install pandoc

Pandoc diinstal di ~/.cabal/bin/pandoc Jadi, ketika saya menjalankannya pandocmasih melihat versi lama. Lihat di sini untuk menambahkan jalur .

Jeromy Anglim
sumber
5
Terima kasih atas jawaban ini. Saya hanya ingin berkomentar bahwa pengalaman saya adalah memberikan file .md ke pandoc , daripada file .html, memberikan hasil yang lebih baik. Jadi, layak untuk bereksperimen.
yoavram
Ini adalah yang terdekat saya dengan proses yang baik juga. Apakah ada cara untuk mengubah teks gambar dari "plot chunk of ..." menjadi sesuatu yang lain?
svenski
1
pandocada di versi 1.12 bahkan di Ubuntu 13.04 saya yang sudah usang.
krlmlr
22

Saya pikir Anda benar-benar membutuhkan pandoc , yang dirancang dan dibangun oleh perangkat lunak yang hebat hanya untuk tugas ini :) Selain pdf , Anda dapat mengonversi file md Anda menjadi mis. Docx atau odt antara lain.

Nah, menginstal Pandoc versi terbaru mungkin menantang di Linux (karena Anda akan membutuhkan seluruh haskell-platformbuilduntuk membangun dari sumber), tetapi sangat mudah pada Windows / Mac dengan hanya beberapa megabyte unduhan.

Jika Anda memiliki file markdown yang diseduh / dirajut, Anda dapat langsung memanggil pandocmis. Bash atau dengan systemfungsi dalam R. Demo POC yang terakhir diimplementasikan dalam Ṗandoc.convertfungsi paket kecil saya ( yang harus Anda sangat bosan ketika saya mencoba untuk arahkan perhatian Anda di sana di setiap kesempatan ).

daroczig
sumber
+1 Fungsi terlihat bagus; Apakah Anda memiliki perintah pandoc satu-liner yang disarankan untuk mengonversi R Markdown ke PDF?
Jeromy Anglim
1
Menambahkan --tocakan berguna pada baris perintah (menghasilkan tabel konten berdasarkan judul Anda) dan juga menyesuaikan template LaTeX untuk kebutuhan Anda (seperti menambahkan di sana \listoffiguresdan / atau \listoftablesdll.) Dapat menghasilkan dokumen yang bagus.
daroczig
3
Apa yang menantang apt-get install pandoc?
sumid
@sumid Anda mungkin telah melewatkan bagian terbaru (yah, jika Anda tidak menggunakan pengujian).
daroczig
Ya, Anda benar - dua kali. Saya melewatkannya dan saya juga menggunakan pengujian ;-) Kemudian saya merasa lebih mudah sementara memungkinkan pengujian sources.listdan melakukan apt-get install -t testing pandockemudian menginstal haskell-platformdan kompilasi. (Biasanya saya melakukan ini dengan eksperimen. Saya harap ini bekerja dengan cara yang sama dalam pengujian.)
sumid
14

Saat ini (Agustus 2014) Anda bisa menggunakan RStudio untuk mengonversi R Markdown ke PDF. Pada dasarnya, RStudio menggunakan pandoc untuk mengonversi Rmd ke PDF.

Anda dapat mengubah metadata menjadi:

  1. Tambahkan daftar isi
  2. Ubah opsi gambar
  3. Ubah gaya penyorotan sintaksis
  4. Tambahkan opsi LaTeX
  5. Dan masih banyak lagi...

Untuk detail lebih lanjut - http://rmarkdown.rstudio.com/pdf_document_format.htmlmasukkan deskripsi gambar di sini

Jot eN
sumber
1
Opsi 'knit PDF' tidak tersedia di Ubuntu 14.04, pandoc v1.17.1. Apakah ada pengaturan yang perlu dilakukan?
Prradep
RStudio versi apa yang Anda miliki? Apakah Anda membuat file rmarkdown baru?
Jot eN
Rstudio - v 0.98.507
Prradep
@ Prradep Apa hasil dari percakapan itu?
nealmcb
10

Untuk opsi yang lebih mirip dengan apa yang Anda dapatkan saat mencetak dari browser, wkhtmltopdfsediakan satu opsi.

Di Ubuntu

sudo apt-get install wkhtmltopdf

Dan kemudian perintah yang sama dengan contoh pandoc untuk menuju ke 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'))"

lalu

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

File yang dihasilkan tampak seperti ini . Tampaknya tidak menangani MathJax ( masalah ini dibahas di sini ), dan page break jelek. Namun, dalam beberapa kasus, gaya seperti itu mungkin lebih disukai daripada presentasi gaya yang lebih LaTeX.

Jeromy Anglim
sumber
Saya tidak dapat menjalankan perintah terakhir di RStudio. Saya telah mencoba system("wkhtmltopdf temp.html temp.pdf") Ada ide bagaimana cara memperbaikinya
Urvah Shabbir
9

Hanya dua langkah:

  1. Instal rilis terbaru "pandoc" dari sini:

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

  2. Panggil fungsi pandocdilibrary(knitr)

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

Dengan demikian, Anda dapat mengubah "input.md" menjadi "input.pdf".

Wei
sumber
3

Saya menemukan menggunakan R studio cara termudah, tetapi jika ingin mengontrol dari baris perintah, maka script R sederhana dapat melakukan trik menggunakan perintah rmarkdown render (seperti yang disebutkan di atas). Detail lengkap skrip di sini

#!/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))
        }
    }
}
Frank Jung
sumber
0

Jika Anda tidak ingin menginstal apa pun, Anda dapat menampilkan html. Kemudian buka file html - itu harus terbuka di jendela browser, lalu klik kanan untuk mencetak. Di jendela cetak, pilih "save as pdf" di sudut kanan bawah jika Anda menggunakan Mac. Voila!

Mariah Akinbi
sumber
0

Ikuti langkah-langkah sederhana ini:

1: Pada skrip Rmarkdown jalankan Knit (Ctrl + Shift + K) 2: Kemudian setelah penurunan html dibuka klik Buka di Browser (sisi kiri atas) dan html dibuka di browser web Anda 3: Kemudian gunakan Ctrl + P dan simpan sebagai PDF.

Ankit Kamboj
sumber