【问题标题】:chartJSRadar downloadhandler creating empty pngchartJSRadar 下载处理程序创建空 png
【发布时间】:2020-05-02 18:15:12
【问题描述】:

我想在我闪亮的应用程序中创建一个下载按钮,以下载使用 chartJSRadar 创建的反应图。我无法解决这个问题! 由于我已经通过互联网上记录的问题,我无法解决它,一直收到一个空的 png。按照建议 (Save plots made in a shiny app), https://groups.google.com/forum/#!msg/shiny-discuss/u7gwXc8_vyY/IZK_o7b7I8gJ
我建立了一个函数...... 所以我的代码是一个示例代码:

ui.R:

library(radarchart)

shinyUI(pageWithSidebar(
  headerPanel('Radarchart Shiny Example'),
  sidebarPanel(
    checkboxGroupInput('selectedPeople', 'Who to include', 
                       names(radarchart::skills)[-1], selected="Rich")
  ),
  mainPanel(
    chartJSRadarOutput("plot1", width = "450", height = "300"), width = 7,
  radioButtons(inputId = "var3", label = "Select the file type", choices = list("png", "pdf")),
  downloadButton('downloadPlot', 'Download Plot')
  )
))

服务器.R


library(radarchart)

shinyServer(function(input, output) {
  output$plot1 <- renderChartJSRadar({

    chartJSRadar(skills[, c("Label", input$selectedPeople)], 
                 maxScale = 10, showToolTipLabel=TRUE)
  })

  plot2 <- function(){
    chartJSRadar(skills[, c("Label", input$selectedPeople)], 
                 maxScale = 10, showToolTipLabel=TRUE)
  }

  output$downloadPlot <- downloadHandler(
    filename = "Shinyplot.png",
    content = function(file) {
      png(file)
      plot2()
      print(plot2())
      dev.off()
  })    
})

【问题讨论】:

    标签: r download chart.js shinyapps radar-chart


    【解决方案1】:

    我认为这是一种 JavaScript 方式,它应该比 webshot 更快。

    library(shiny)
    library(radarchart)
    library(htmlwidgets) # to use the 'onRender' function
    
    js <- c(
      "function(el, x){",
      "  $('#downloadPlot').on('click', function(){",
      "    // Clone the chart to add a background color.",
      "    var cloneCanvas = document.createElement('canvas');",
      "    cloneCanvas.width = el.width;",
      "    cloneCanvas.height = el.height;",
      "    var ctx = cloneCanvas.getContext('2d');",
      "    ctx.fillStyle = '#FFFFFF';",
      "    ctx.fillRect(0, 0, el.width, el.height);",
      "    ctx.drawImage(el, 0, 0);",
      "    // Download.",
      "    const a = document.createElement('a');",
      "    document.body.append(a);",
      "    a.download = 'radarchart.png';",
      "    a.href = cloneCanvas.toDataURL('image/png');",
      "    a.click();",
      "    a.remove();",
      "  });",
      "}"
    )
    
    ui <- pageWithSidebar(
      headerPanel('Radarchart Shiny Example'),
      sidebarPanel(
        checkboxGroupInput('selectedPeople', 'Who to include', 
                           names(radarchart::skills)[-1], selected="Rich"),
        actionButton('downloadPlot', 'Download Plot')
      ),
      mainPanel(
        chartJSRadarOutput("plot1", width = "450", height = "300"), width = 7
      )
    )
    
    server <- function(input, output) {
      output$plot1 <- renderChartJSRadar({
        chartJSRadar(skills[, c("Label", input$selectedPeople)], 
                     maxScale = 10, showToolTipLabel=TRUE) %>% 
          onRender(js)
      })
    }
    
    shinyApp(ui, server)
    

    这仅导出到png。使用webshot 导出到pdf


    编辑

    library(shiny)
    library(radarchart)
    
    js <- paste0(c(
      "$(document).ready(function(){",
      "  $('#downloadPlot').on('click', function(){",
      "    var el = document.getElementById('plot1');",
      "    // Clone the chart to add a background color.",
      "    var cloneCanvas = document.createElement('canvas');",
      "    cloneCanvas.width = el.width;",
      "    cloneCanvas.height = el.height;",
      "    var ctx = cloneCanvas.getContext('2d');",
      "    ctx.fillStyle = '#FFFFFF';",
      "    ctx.fillRect(0, 0, el.width, el.height);",
      "    ctx.drawImage(el, 0, 0);",
      "    // Download.",
      "    const a = document.createElement('a');",
      "    document.body.append(a);",
      "    a.download = 'radarchart.png';",
      "    a.href = cloneCanvas.toDataURL('image/png');",
      "    a.click();",
      "    a.remove();",
      "    cloneCanvas.remove();",
      "  });",
      "});"
    ), collapse = "\n")
    
    ui <- pageWithSidebar(
      headerPanel('Radarchart Shiny Example'),
      sidebarPanel(
        checkboxGroupInput('selectedPeople', 'Who to include', 
                           names(radarchart::skills)[-1], selected="Rich"),
        actionButton('downloadPlot', 'Download Plot')
      ),
      mainPanel(
        tags$head(tags$script(HTML(js))),
        chartJSRadarOutput("plot1", width = "450", height = "300"), width = 7
      )
    )
    
    server <- function(input, output) {
      output$plot1 <- renderChartJSRadar({
        chartJSRadar(skills[, c("Label", input$selectedPeople)], 
                     maxScale = 10, showToolTipLabel=TRUE) 
      })
    }
    
    shinyApp(ui, server)
    

    【讨论】:

    • 非常感谢 Stéphane。你的提议要快得多!我观察到的问题是:每次更改雷达图(包括或排除“要包括的人”选择菜单中的人时,单击一次下载按钮后都会尝试保存单独的雷达图。这可能是由于 onRender 功能. 有没有办法在情节更改后“只”保存一个情节。
    【解决方案2】:

    chartJSRadar 返回一个htmlWidget。要保存,请尝试使用saveWidget,然后使用临时html 文件的webshot。添加webshot库:

    library(webshot)
    

    并尝试在您的 server 函数中将其替换为 downloadHandler

    output$downloadPlot <- downloadHandler(
      filename = "Shinyplot.png",
      content = function(file) {
        saveWidget(plot2(), "temp.html", selfcontained = TRUE)
        webshot("temp.html", file = file)
      }
    ) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 2019-02-15
      • 2011-03-06
      • 2013-08-15
      • 1970-01-01
      • 2011-10-26
      • 2020-12-10
      相关资源
      最近更新 更多