Экспорт rpivottable в виде изображения

Недавно я начал использовать rPivotTable для создания впечатляющих диаграмм и таблиц. Я использую rPivotTable в приложении Shiny. Мне было интересно, можно ли экспортировать вывод rPivotTable (таблица, гистограмма, линейная диаграмма и т. д.) в виде изображения из веб-браузера. В RStudio (без Shiny) это можно сделать, поскольку в средстве просмотра есть опция «Экспорт-> Сохранить как изображение». Есть ли способ сохранить диаграммы и таблицы.


person Suneel Kumar    schedule 26.02.2020    source источник


Ответы (1)


Сводная таблица — это виджет html, поэтому вы можете использовать htmlwidgets::saveWidget для сохранения таблицы в файле html и webshot::webshot для экспорта в png (или pdf).

library(shiny)
library(rpivotTable)
library(htmlwidgets)
library(webshot)

ui <- fluidPage(
  br(),
  rpivotTableOutput("pivotbl"),
  br(),
  downloadButton("export", "Export")
)

server <- function(input, output, session){

  pivotTable <- rpivotTable(
    Titanic,
    rows = "Survived",
    cols = c("Class","Sex"),
    aggregatorName = "Sum as Fraction of Columns",
    inclusions = list( Survived = list("Yes")),
    exclusions= list( Class = list( "Crew")),
    vals = "Freq",
    rendererName = "Table Barchart"
  )

  output[["pivotbl"]] <- renderRpivotTable({
    pivotTable
  })

  output[["export"]] <- downloadHandler(
    filename = function(){
      "pivotTable.png"
    },
    content = function(file){
      tmphtml <- tempfile(fileext = ".html")
      saveWidget(pivotTable, file = tmphtml)
      webshot(tmphtml, file = file)
    }
  )

}

shinyApp(ui, server)

РЕДАКТИРОВАТЬ

Вот способ экспортировать только график с помощью библиотеки JavaScript dom-to-image.

Загрузите файл dom-to-image.min.js и поместите его в подпапку www приложения.

Вот приложение:

library(shiny)
library(rpivotTable)

js <- "
function filter(node){
  return (node.tagName !== 'i');
}
function exportPlot(filename){
  var plot = document.getElementsByClassName('pvtRendererArea');
  domtoimage.toPng(plot[0], {filter: filter, bgcolor: 'white'})
    .then(function (dataUrl) {
      var link = document.createElement('a');
      link.download = filename;
      link.href = dataUrl;
      link.click();
    });
}
Shiny.addCustomMessageHandler('export', exportPlot);
"

ui <- fluidPage(
  tags$head(
    tags$script(src = "dom-to-image.min.js"),
    tags$script(HTML(js))
  ),
  br(),
  rpivotTableOutput("pivotbl"),
  br(),
  actionButton("export", "Export")
)

server <- function(input, output, session){

  pivotTable <- rpivotTable(
    Titanic,
    rows = "Survived",
    cols = c("Class","Sex"),
    aggregatorName = "Sum as Fraction of Columns",
    inclusions = list( Survived = list("Yes")),
    exclusions= list( Class = list( "Crew")),
    vals = "Freq",
    rendererName = "Table Barchart"
  )

  output[["pivotbl"]] <- renderRpivotTable({
    pivotTable
  })

  observeEvent(input[["export"]], {
    session$sendCustomMessage("export", "plot.png")
  })  

}

shinyApp(ui, server)
person Stéphane Laurent    schedule 26.02.2020
comment
Прослушивание 127.0.0.1:6474 PhantomJS не найдено. Вы можете установить его с помощью webshot::install_phantomjs(). Если он установлен, убедитесь, что исполняемый файл phantomjs можно найти через переменную PATH. - person Suneel Kumar; 26.02.2020
comment
@SuneelKumar Так ты запустил webshot::install_phantomjs()? - person Stéphane Laurent; 26.02.2020
comment
см. мой код здесь ссылка - person Suneel Kumar; 26.02.2020
comment
1. Нажмите кнопку «Обзор», чтобы выбрать файл формата xlsx. 2.in (Select One...) selectinput выберите Table, а затем нажмите кнопку Lets Go. после этого нажмите Загрузить данные... данные кнопки будут загружены - person Suneel Kumar; 26.02.2020
comment
если я выберу изображение, нажав «Загрузить виджет», следует загрузить только график, а не весь виджет HTML - person Suneel Kumar; 26.02.2020
comment
@SuneelKumar Пожалуйста, посмотрите мое редактирование. Это приложение экспортирует только график. - person Stéphane Laurent; 27.02.2020
comment
Теперь он работает нормально, я могу загрузить изображение. Спасибо, Лоран, за то, что помог мне решить эту проблему. - person Suneel Kumar; 02.03.2020