2016-11-09 3 views
1

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

Мой код:

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

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

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

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

ответ

1

Это не должно быть ответом, а всего лишь указателем на возможное направление решения этой проблемы. В общем, вывод 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) 
} 
+0

Большое спасибо за код! Я определенно буду работать над этим! Я думаю, что «Скриншот html» - очень хорошее направление для решения этой проблемы. Кроме того, если эта проблема может быть решена таким образом, мы можем применить/расширить один и тот же метод для вывода интерактивного графика в PDF-проблемы. Например, если я хочу сохранить результаты из «rpivotTable» (один из очень полезных и гибких r-пакетов для сводной таблицы), я могу сделать снимок экрана html и вернуть изображение в knitr!Еще раз спасибо за вашу помощь! – Joanna

0

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

Спасибо!