Можно ли с помощью RMarkdown создать RTable (FlexTable) в формате PDF?

Мне просто любопытно, можно ли сгенерировать RTable (FlexTable) в pdf с помощью RMarkdown? Я могу сгенерировать его в выводе html, но он не работает для вывода pdf. Я гуглил этот вопрос, но на него нет точного ответа.

Мой код:

```{r, echo=FALSE, results='asis'}
library(ReporteRsjars)
library(ReporteRs)
library(rtable)
library(dplyr)
vanilla.table(iris)
```

Поскольку он может генерироваться в словах, я предполагаю, что это возможно для PDF-файла.

Я пробовал cat(as.html(vanilla.table(iris))), но это не работает.

Могу я по-дружески спросить, есть ли у вас какое-нибудь представление об этом?


person Joanna    schedule 09.11.2016    source источник


Ответы (2)


Это не ответ, а всего лишь указатель на возможное направление решения этой проблемы. В общем, вывод HTML в фрагментах кода R документа R Markdown не будет работать для вывода PDF только потому, что HTML и LaTeX совершенно разные. Однако есть косвенный способ попасть туда, а именно сделать снимок экрана с выводом HTML и вместо этого вставить изображение. Этот подход используется в knitr для работы с виджетами HTML, когда формат вывода не является HTML. Вы можете найти технические подробности в https://github.com/yihui/knitr/blob/master/R/plot.R (см. функцию html_screenshot()).

Основная идея состоит в том, чтобы сохранить вывод HTML в виде файла *.html, сделать снимок экрана с помощью пакета webshot (для которого требуется PhantomJS) и вернуть изображение в knitr. Не должно быть слишком сложно обобщить эту идею для любого вывода HTML, но я не думал об этом очень тщательно. Однако это не означает, что вы не можете реализовать его самостоятельно. Ниже приведен набросок, который я напечатал не в своей голове, и, безусловно, есть много деталей, которые нужно улучшить:

insert_screenshot = function(x) {
  if (!inherits(x, c('html', 'shiny.tag'))) return()
  htmltools::save_html(x, 'temp.html')
  res = webshot::webshot('temp.html', 'my-screenshot.png')
  knitr::include_graphics(res)
}
person Yihui Xie    schedule 09.11.2016
comment
Большое спасибо за код! Я обязательно над этим поработаю! Я думаю, что снимок экрана html - очень хорошее направление для решения этой проблемы. Кроме того, если эта проблема может быть решена таким образом, мы можем применить / расширить тот же метод для вывода интерактивного графика в проблемы PDF. Например, если я хочу сохранить результаты из rpivotTable (один из очень полезных и гибких пакетов r для сводной таблицы), я могу сделать снимок экрана html и вернуть изображение в knitr! Еще раз спасибо за вашу помощь! - person Joanna; 10.11.2016

Спасибо за @Yihui,

Я разобрался в этой проблеме. По сути, решение состоит в том, чтобы сделать снимок экрана с помощью webshot функции и knitr::include_graphics, чтобы вставить этот png-файл в выходной файл pdf.

Пожалуйста, попробуйте этот фрагмент кода в своей уценке:

```{r TableJiena, out.width = "700px", out.length = "400px"}

insert_screenshot = function(x) {
  if (!inherits(x, c('html', 'shiny.tag'))) return()
  htmltools::save_html(x, 'temp.html')
  res = webshot::webshot('temp.html', 'my-screenshot.png')
  knitr::include_graphics(res)
}
insert_screenshot(htmltools::HTML(as.html(vanilla.table(head(iris)))))
```

Если вы хотите получить упрощенный код, попробуйте этот фрагмент кода в Markdown.

```{r TableJiena, out.width = "700px", out.length = "400px"}
webshot::webshot(htmltools::HTML(as.html(vanilla.table(head(iris)))), 'my-screenshot.png')
knitr::include_graphics('my-screenshot.png')
```

Но у этого решения есть небольшая проблема: разрешение изображения PNG не очень высокое, и я не знаю, почему между каждым столбцом есть потоки. Кроме того, некоторые одинарные строки печатаются двойными.

Может ли кто-нибудь понять, как решить эту незначительную проблему webshot?

Спасибо!

person Joanna    schedule 15.11.2016