Можно ли сгенерировать RTable (FlexTable) в PDF с RMarkdown?

Мне просто интересно, можно ли сгенерировать 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))) Но это не работает.

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

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)
}

Спасибо за @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?

Спасибо!

Другие вопросы по тегам