首页 > 解决方案 > ShinyAlert 作为 downloadHandler 中的输入

问题描述

有没有办法Shinyalert()用作文件名输入downloadHandler()?我想创建一个应用程序,用户可以在其中下载绘图,并且会出现“另存为:”弹出输入消息。然后文件将保存为输入的任何内容。

我尝试使用 ShinyAlert 执行此操作,但即使我收到弹出输入消息,文件也会在我按下下载按钮的那一刻下载。这是我到目前为止所拥有的:

用户界面:

ui <- fluidPage(
  useShinyalert(),
  plotOutput("vmgraph"),
  downloadButton("downloadPlot", "Download Plot")
) 

服务器:

server <- function(input, output) {

output$vmgraph <- renderPlot({vmgraph()})

rv <- reactiveValues(download_flag = 0)
  
output$downloadPlot <- downloadHandler(
    filename = function(){
      rv$download_flag <- rv$download_flag + 1
      if (rv$download_flag > 0) {
        shinyalert("Save as:", 
                   type = "input", 
                   size = "m", 
                   closeOnEsc = TRUE, 
                   closeOnClickOutside = TRUE, 
                   showConfirmButton = TRUE, 
                   showCancelButton = TRUE,
                   confirmButtonText = "Save", 
                   confirmButtonCol = "#0075B8",
                   animation = TRUE)
      }
      paste(input$shinyalert, ".png", sep = "")},
    content = function(file) {
      ggsave(file, plot = vmgraph(), width = 12, height = 7.7)
    }
  )

download_flag用来作为Shinyalert(). 一直试图找到一种方法让它工作几个小时,所以任何帮助都将不胜感激。

标签: rshinyshinyalert

解决方案


我得到了接近你想要的东西。关键是使用html=TRUEtagList在shinyalert中放置a,以使“确认”按钮成为downloadButton(),然后使用一些javascript:

library(shiny)
library(shinyalert)
library(ggplot2)
library(shinyjs)

ui <- fluidPage(
  useShinyjs(),
  useShinyalert(),
  plotOutput("vmgraph"),
  actionButton("downloadPlot", "Download Plot")
) 

server <- function(input, output) {
  
  output$vmgraph <- renderPlot({plot(mtcars)})
  
  observeEvent(input$downloadPlot, {
    shinyalert("Save as:", 
               type = "info",
               size = "m",
               html = TRUE,
               text = tagList(
                 textInput(inputId = "name", label = NULL ),
                 downloadButton("confName", "Confirm")
               ),
               closeOnEsc = TRUE,
               closeOnClickOutside = TRUE,
               showConfirmButton = FALSE,
               showCancelButton = TRUE,
               animation = TRUE
    )
    runjs("
        var confName = document.getElementById('confName')
        confName.onclick = function() {swal.close();}
        ")
  })
  
  output$confName <- downloadHandler(
    filename = function(){
      paste(input$name, ".png", sep = "")},
    content = function(file) {
      ggsave(file, plot = plot(mtcars), width = 12, height = 7.7)
    }
  )

}
  
shinyApp(ui, server)

推荐阅读