Как конвертировать R Markdown в PDF?

127

Ранее я спрашивал о командах для преобразования R Markdown в HTML .

Как лучше конвертировать файлы R Markdown в документы PDF?

Хорошее решение сохранит как можно больше содержимого (например, изображения, уравнения, таблицы HTML и т. Д.). Решение должно быть запущено из командной строки. Хорошим решением также будет кроссплатформенность и, в идеале, минимизация зависимостей, чтобы упростить совместное использование make-файлов и т. Д.

Конкретно вариантов очень много:

  • Преобразовывать ли 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
Colonel Panic
markdowntopdf.com , на самом деле, этот сайт довольно хорош. Однако латексной поддержки нет
падаван
Можем ли мы обновить этот ответ для RStudio v1.0?
Adam_G

Ответы:

69

Обновленный ответ (10 фев 2013)

Пакет rmarkdown : теперь rmarkdownна github доступен пакет, который взаимодействует с Pandoc. Он включает в себя renderфункцию. В документации довольно понятно, как конвертировать rmarkdown в pdf среди ряда других форматов. Это включает в себя включение форматов вывода в файл rmarkdown или выполнение задания формата вывода для функции rend. Например,

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

Командная строка: когда я запускаю renderиз командной строки (например, используя make-файл), у меня иногда возникают проблемы с тем, что pandoc не может быть найден. Предположительно, его нет на пути поиска. Следующий ответ объясняет , как добавить pandoc в среде R .

Так, например, на моем компьютере под управлением OSX, где у меня есть копия pandoc через RStudio, я могу использовать следующее:

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

Старый ответ (около 2012 г.)

Итак, некоторые люди предположили, что Pandoc - это правильный путь. См. Примечания ниже о важности наличия последней версии Pandoc.

Использование Pandoc

Я использовал следующую команду для преобразования R Markdown в HTML (т. Е. Вариант этого make-файла ), где 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, для вывода PDF-файлов важно иметь последнюю версию Pandoc. На Ubuntu с 15 июня 2012 года я застрял с версией 1.8.1 Pandoc в диспетчере пакетов, но из журнала изменений видно, что для поддержки pdf вам нужна как минимум версия 1.9+ Pandoc.

Итак, я установил 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 07
22

Я думаю, вам действительно нужен pandoc , отличное программное обеспечение, которое было разработано и построено именно для этой задачи :) Помимо pdf , вы можете преобразовать ваш файл md, например, в docx или odt .

Что ж, установкаhaskell-platform последней версии Pandoc может быть сложной задачей для Linux (так как вам потребуется вся ˙ для сборки из исходных кодов), но очень просто на Windows / Mac с загрузкой всего нескольких мегабайт.

Если у вас есть сваренный / связанный файл уценки, вы можете просто вызвать, pandocнапример, bash или systemфункцию в R.Демонстрация POC этого последнего реализована в Ṗandoc.convertфункции моего маленького пакета ( который вам, должно быть, ужасно скучно, поскольку я пытаюсь обращайте на это внимание при каждой возможности ).

daroczig
источник
+1 Функция выглядит неплохо; У вас есть рекомендуемая однострочная команда pandoc для преобразования R Markdown в PDF?
Джероми Энглим
1
Добавление --tocбыло бы полезно в командной строке (что привело бы к таблице содержимого nics на основе ваших заголовков), а также настройка шаблона 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введите описание изображения здесь

Jot eN
источник
1
Опция «связать PDF» недоступна в Ubuntu 14.04, pandoc v1.17.1. Нужны ли какие-то настройки?
Prradep 08
Какая у вас версия RStudio? Вы создали новый файл rmarkdown?
Jot eN
Rstudio - версия 0.98.507
Prradep 08
@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") Любые идеи, как это исправить
Урва Шабир
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 (как упоминалось выше). Полная информация о сценарии здесь

#!/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. Вуаля!

Мэрайя Акинби
источник
0

Следуйте этим простым шагам:

1: В сценарии Rmarkdown запустите Knit (Ctrl + Shift + K) 2: Затем после открытия HTML-разметки нажмите Открыть в браузере (вверху слева), и HTML откроется в вашем веб-браузере 3: Затем используйте Ctrl + P и сохранить как PDF.

Анкит Камбодж
источник