r-chartJSRadar下载处理程序正在创建空png



我想在我闪亮的应用程序中创建一个下载按钮,下载用chartJSRadar创建的反应图。我解决不了这个问题!由于我在互联网上经历了这个记录在案的问题,我无法解决它,一直收到一个空的png。按照建议(保存在闪亮应用程序中制作的绘图(,https://groups.google.com/forum/#!msg/shind-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()
})    
})

这里有一种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)

chartJSRadar返回一个htmlWidget。要保存,请尝试使用临时html文件的saveWidget,然后使用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)
}
) 

相关内容

  • 没有找到相关文章

最新更新