Jak przekonwertować R Markdown do PDF?

129

Wcześniej pytałem o polecenia do konwersji R Markdown do HTML .

Jaki jest dobry sposób na konwersję plików R Markdown do dokumentów PDF?

Dobre rozwiązanie pozwoliłoby zachować jak najwięcej treści (np. Obrazy, równania, tabele html itp.). Rozwiązanie musi być uruchamiane z wiersza poleceń. Dobrym rozwiązaniem byłoby również wieloplatformowe i idealnie zminimalizować zależności, aby ułatwić współdzielenie plików makefile i tak dalej.

W szczególności istnieje wiele opcji:

  • Czy przekonwertować RMD na MD do HTML do PDF; lub RMD na MD do PDF; lub RMD do PDF
  • Jeśli używasz markdownpakietu w R, jakie opcje określić
  • Czy użyć pandocpakietu wbudowanego w R, czy czegoś innego

Oto przykładowy plik rmd, który prawdopodobnie zapewnia rozsądny test każdego proponowanego rozwiązania. Został użyty jako podstawa do tego wpisu na blogu .

Jeromy Anglim
źródło
7
Uważam, że pandoc powinien być najlepszą drogą. Nie ma dla mnie sensu wbudowywanie go w R i nie sądzę, żeby było to możliwe (jest napisane w języku Haskell). Mam tutaj kilka bardzo wczesnych prac: github.com/yihui/knitr-book (zobacz dwa skrypty powłoki kniti mdconvert.sh). Może być trudno znaleźć podejście ogólne, ponieważ LaTeX jest zbyt elastyczny; możesz używać wszelkiego rodzaju szablonów dla pandoc.
Yihui Xie
Co to jest „R Markdown *”? rstudio.com/ide/docs/r_markdown
Colonel Panic
markdowntopdf.com ta strona jest właściwie całkiem dobra. Jednak nie ma wsparcia dla lateksu
padawan
Czy możemy zaktualizować tę odpowiedź dla RStudio v1.0?
Adam_G

Odpowiedzi:

70

Zaktualizowana odpowiedź (10 lutego 2013)

Pakiet rmarkdown : Na rmarkdowngithub jest teraz dostępny pakiet, który łączy się z Pandoc. Zawiera renderfunkcję. Dokumentacja wyjaśnia, jak przekonwertować rmarkdown do formatu PDF wśród wielu innych formatów. Obejmuje to dołączanie formatów wyjściowych do pliku rmarkdown lub uruchamianie dostarczania formatu wyjściowego do funkcji rend. Na przykład,

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

Linia poleceń: Kiedy uruchamiam się renderz wiersza poleceń (np. Używając pliku makefile), czasami mam problemy z nie znalezieniem pandoc. Prawdopodobnie nie znajduje się na ścieżce wyszukiwania. Poniższa odpowiedź wyjaśnia , jak dodać pandoc dla środowiska R .

Na przykład na moim komputerze z systemem OSX, na którym mam kopię pandoc przez RStudio, mogę użyć:

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

Stara odpowiedź (około 2012)

Tak więc wiele osób zasugerowało, że Pandoc jest właściwą drogą. Zapoznaj się z poniższymi uwagami dotyczącymi znaczenia posiadania aktualnej wersji Pandoc.

Korzystanie z Pandoc

Użyłem następującego polecenia, aby przekonwertować R Markdown do HTML (tj. Wariant tego makefile ), gdzie RMDFILEjest nazwa pliku R Markdown bez .rmdkomponentu (zakłada również, że rozszerzenie jest, .rmda nie .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'))"

a następnie to polecenie do konwersji do formatu pdf

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


Kilka uwag na ten temat:

  • Usunąłem odniesienie w pliku przykładowym, które eksportuje wykresy do imgur do obrazów hosta.
  • Usunąłem odniesienie do obrazu hostowanego na imgur. Wydaje się, że liczby muszą być lokalne.
  • Opcje w markdownToHTMLfunkcji oznaczały, że odniesienia do obrazów dotyczą plików, a nie danych przechowywanych w pliku HTML (tj. Usunąłem je 'base64_images'z listy opcji).
  • Wynikowy wynik wyglądał następująco . Wyraźnie stworzył dokument w stylu LaTeX, w przeciwieństwie do tego, co otrzymuję, gdy wydrukuję plik HTML do formatu PDF z przeglądarki.

Pobieranie aktualnej wersji Pandoc

Jak wspomniał @daroczig, ważne jest, aby mieć aktualną wersję Pandoc do drukowania plików PDF. W systemie Ubuntu od 15 czerwca 2012 utknąłem z wersją 1.8.1 Pandoc w menedżerze pakietów, ale z dziennika zmian wynika, że ​​do obsługi formatu PDF potrzebujesz co najmniej wersji 1.9+ Pandoc.

Tak więc zainstalowałem caball-install. A potem pobiegł:

cabal update
cabal install pandoc

Pandoc został zainstalowany w programie ~/.cabal/bin/pandoc Tak więc, kiedy uruchomiłem pandoc, nadal wyświetlał starą wersję. Zobacz tutaj, aby dodać do ścieżki .

Jeromy Anglim
źródło
5
Dzięki za tę odpowiedź. Chcę tylko skomentować, że z mojego doświadczenia wynika, że ​​przekazanie pliku .md do pandoc , a nie pliku .html, dało lepsze wyniki. Warto więc poeksperymentować.
yoavram
To również najbliższa mi droga do dobrego procesu. Czy istnieje sposób na zmianę tekstu rysunku z „kawałka fabuły ...” na coś innego?
svenski
1
pandocjest w wersji 1.12, nawet w moim przestarzałym Ubuntu 13.04.
krlmlr
22

Myślę, że naprawdę potrzebujesz pandoc , którego świetne oprogramowanie zostało zaprojektowane i zbudowane specjalnie do tego zadania :) Oprócz pdf , możesz przekonwertować plik md np. Do formatu docx lub odt .

Cóż, zainstalowanie aktualnej wersji Pandoc może być wyzwaniem w Linuksie (ponieważ potrzebowałbyś całego haskell-platform˙ do zbudowania ze źródeł), ale naprawdę łatwe w systemie Windows / Mac przy zaledwie kilku megabajtach pobrania.

Jeśli masz parzony / dzianinowy plik przecen, możesz po prostu wywołać pandocnp. Bash lub z systemfunkcją w R. Demo POC tego ostatniego jest zaimplementowane w Ṗandoc.convertfunkcji mojej małej paczki ( którą musisz strasznie się nudzić, gdy próbuję kieruj swoją uwagę przy każdej okazji ).

daroczig
źródło
+1 Funkcja wygląda dobrze; Czy masz zalecane jedno-liniowe polecenie pandoc do konwersji R Markdown do PDF?
Jeromy Anglim
1
Dodanie --tocbyłoby przydatne w wierszu poleceń (w wyniku czego powstałaby tabela zawartości nics na podstawie nagłówków), a także dostosowanie szablonu LaTeX do własnych potrzeb (np. Dodanie tam \listoffiguresi / lub \listoftablesitp.) Może spowodować powstanie wspaniałych dokumentów.
daroczig
3
Jakie wyzwanie apt-get install pandoc?
sumid
@sumid mogłeś przegapić aktualną część (cóż, jeśli nie używasz testowania).
daroczig
Tak, masz rację - dwa razy. Przegapiłem to i używam też testowania ;-) Wtedy postrzegam to jako łatwiejsze tymczasowe umożliwienie testowania sources.listi wykonywania, apt-get install -t testing pandoca następnie instalacji haskell-platformi kompilacji. (Zwykle robię to eksperymentalnie. Mam nadzieję, że działa to w ten sam sposób w testowaniu).
sumid
14

W tej chwili (sierpień 2014) możesz użyć RStudio do konwersji R Markdown do PDF. Zasadniczo RStudio używa pandoc do konwersji Rmd do PDF.

Możesz zmienić metadane na:

  1. Dodaj spis treści
  2. Zmień opcje figur
  3. Zmień styl podświetlania składni
  4. Dodaj opcje LaTeX
  5. I wiele więcej...

Więcej szczegółów - http://rmarkdown.rstudio.com/pdf_document_format.htmlwprowadź opis obrazu tutaj

Jot eN
źródło
1
Opcja „dzianiny PDF” nie jest dostępna w Ubuntu 14.04, pandoc v1.17.1. Czy trzeba wprowadzić jakieś ustawienia?
Prradep,
Jaką masz wersję RStudio? Czy utworzyłeś nowy plik rmarkdown?
Jot eN
Rstudio - v 0.98.507
Prradep
@Prradep Jaki był wynik rozmowy?
nealmcb
10

W przypadku opcji, która bardziej przypomina to, co otrzymujesz podczas drukowania z przeglądarki, wkhtmltopdfudostępnia jedną opcję.

Na Ubuntu

sudo apt-get install wkhtmltopdf

A następnie to samo polecenie, co w przykładzie pandoc, aby dostać się do 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'))"

i wtedy

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

Wynikowy plik wyglądał następująco . Wydawało się, że nie radzi sobie z MathJaxem ( ten problem jest omawiany tutaj ), a podziały stron są brzydkie. Jednak w niektórych przypadkach taki styl może być preferowany zamiast prezentacji w stylu bardziej LaTeX.

Jeromy Anglim
źródło
Nie mogę uruchomić ostatniego polecenia w RStudio. Próbowałem system("wkhtmltopdf temp.html temp.pdf") Każdy pomysł, jak to naprawić
Urvah Shabbir
9

Tylko dwa kroki:

  1. Zainstaluj najnowszą wersję „pandoc” stąd:

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

  2. Wywołaj funkcję pandocwlibrary(knitr)

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

W ten sposób możesz przekonwertować plik „input.md” na „input.pdf”.

Wei
źródło
3

Najłatwiej znalazłem użycie R studio, ale jeśli chcesz sterować z wiersza poleceń, prosty skrypt R może załatwić sprawę za pomocą polecenia renderowania rmarkdown (jak wspomniano powyżej). Pełne szczegóły skryptu tutaj

#!/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
źródło
0

Jeśli nie chcesz niczego instalować, możesz wyprowadzić html. Następnie otwórz plik html - powinien otworzyć się w oknie przeglądarki, a następnie kliknij prawym przyciskiem myszy, aby wydrukować. W oknie drukowania wybierz „zapisz jako pdf” w prawym dolnym rogu, jeśli używasz komputera Mac. Voila!

Mariah Akinbi
źródło
0

Wykonaj te proste kroki:

1: W skrypcie Rmarkdown uruchom Knit (Ctrl + Shift + K) 2: Następnie po otwarciu znacznika html kliknij Otwórz w przeglądarce (lewa górna strona), a html zostanie otwarty w przeglądarce internetowej 3: Następnie użyj Ctrl + P i zapisz jako PDF.

Ankit Kamboj
źródło