R 渲染后禁用下载按钮

R 渲染后禁用下载按钮,r,shiny,R,Shiny,我想动态更改downloadButton标签(响应save_format),我想首先禁用downloadButton。我试着遵循中给出的建议,但它似乎只模糊了下载按钮,但我仍然可以点击它。下面是一个例子: library(shiny) ui <- navbarPage( title = "TEST", tabPanel( "EXAMPLE", b

我想动态更改downloadButton标签(响应
save_format
),我想首先禁用downloadButton。我试着遵循中给出的建议,但它似乎只模糊了下载按钮,但我仍然可以点击它。下面是一个例子:

library(shiny)

ui <- navbarPage(
    
    title = "TEST",
    
    tabPanel(
        
        "EXAMPLE",
        
        bootstrapPage(  
            
            absolutePanel(
                
                uiOutput(outputId = "download_ui"),
                selectInput(
                    inputId = "save_format",
                    label = NULL,
                    choices = c("format1", "format2"),
                    selected = "csv"
                )
            )
        )
    )
)

server <- function(input, output) {

    output$download_ui <- renderUI({
        
        downloadButton(
            outputId = "download",
            label = str_c("Download ", input$save_format),
            disabled = ""
        )
    })
    
    output$download <- downloadHandler(
        
        filename = function() {
            str_c("file-", Sys.Date(), ".", input$save_format)
        },
        
        content = function(file){
                # some function for saving in correct format
        }
    )
}
    
shinyApp(ui = ui, server = server)
库(闪亮)

ui您可以有点偷偷摸摸,允许
downloadHandler
设置反应值,然后响应反应值的更改。这对我很有用:

library(shiny)
library(shinyjs)

ui <- navbarPage(
  useShinyjs(),
  title = "TEST",
  tabPanel(
    "EXAMPLE",
    bootstrapPage(  
      absolutePanel(
        uiOutput(outputId = "download_ui"),
        selectInput(
          inputId = "save_format",
          label = NULL,
          choices = c("format1", "format2"),
          selected = "csv"
        )
      )
    )
  )
)

server <- function(input, output) {
  v <- reactiveValues(
    downloadDone=FALSE
  )
  
  output$download_ui <- renderUI({
    downloadButton(
      outputId = "download",
      label = str_c("Download ", input$save_format)
    )
  })
  
  observeEvent(v$downloadDone, {
    if (v$downloadDone) disable("download")
    else enable("download")
  })
  
  output$download <- downloadHandler(
    filename = function() {
      str_c("file-", Sys.Date(), ".", input$save_format)
    },
    content = function(file){
      v$downloadDone <- TRUE
    }
  )
}

shinyApp(ui = ui, server = server)
库(闪亮)
图书馆(shinyjs)

ui您可以有点偷偷摸摸,允许
downloadHandler
设置反应值,然后响应反应值的更改。这对我很有用:

library(shiny)
library(shinyjs)

ui <- navbarPage(
  useShinyjs(),
  title = "TEST",
  tabPanel(
    "EXAMPLE",
    bootstrapPage(  
      absolutePanel(
        uiOutput(outputId = "download_ui"),
        selectInput(
          inputId = "save_format",
          label = NULL,
          choices = c("format1", "format2"),
          selected = "csv"
        )
      )
    )
  )
)

server <- function(input, output) {
  v <- reactiveValues(
    downloadDone=FALSE
  )
  
  output$download_ui <- renderUI({
    downloadButton(
      outputId = "download",
      label = str_c("Download ", input$save_format)
    )
  })
  
  observeEvent(v$downloadDone, {
    if (v$downloadDone) disable("download")
    else enable("download")
  })
  
  output$download <- downloadHandler(
    filename = function() {
      str_c("file-", Sys.Date(), ".", input$save_format)
    },
    content = function(file){
      v$downloadDone <- TRUE
    }
  )
}

shinyApp(ui = ui, server = server)
库(闪亮)
图书馆(shinyjs)

ui当然
shinyjs::disable
不起作用,因为下载按钮尚未呈现。这里有一种方法可以避免
renderUI
,这样您就可以使用
禁用
。它还使用
runjs
运行一些JS代码来更改标签

library(shiny)
library(shinyjs)

ui <- fluidPage(
  useShinyjs(),
  downloadButton("downloadData", "Download"),
  br(),
  selectInput(
    inputId = "save_format",
    label = NULL,
    choices = c("csv", "xlsx"),
    selected = "csv"
  )
)

server <- function(input, output) {
  # Our dataset
  data <- mtcars
  
  output$downloadData <- downloadHandler(
    filename = function() {
      paste("data-", Sys.Date(), ".csv", sep="")
    },
    content = function(file) {
      write.csv(data, file)
    }
  )
  
  disable("downloadData") # disable download button
  
  observeEvent(input$save_format, { # change download button label
    runjs(
      sprintf("$('#downloadData').contents()[2].nodeValue = '\\rDownload %s\\r'", 
              input$save_format)
    )
  })
}

shinyApp(ui, server)
库(闪亮)
图书馆(shinyjs)

ui当然
shinyjs::disable
不起作用,因为下载按钮尚未呈现。这里有一种方法可以避免
renderUI
,这样您就可以使用
禁用
。它还使用
runjs
运行一些JS代码来更改标签

library(shiny)
library(shinyjs)

ui <- fluidPage(
  useShinyjs(),
  downloadButton("downloadData", "Download"),
  br(),
  selectInput(
    inputId = "save_format",
    label = NULL,
    choices = c("csv", "xlsx"),
    selected = "csv"
  )
)

server <- function(input, output) {
  # Our dataset
  data <- mtcars
  
  output$downloadData <- downloadHandler(
    filename = function() {
      paste("data-", Sys.Date(), ".csv", sep="")
    },
    content = function(file) {
      write.csv(data, file)
    }
  )
  
  disable("downloadData") # disable download button
  
  observeEvent(input$save_format, { # change download button label
    runjs(
      sprintf("$('#downloadData').contents()[2].nodeValue = '\\rDownload %s\\r'", 
              input$save_format)
    )
  })
}

shinyApp(ui, server)
库(闪亮)
图书馆(shinyjs)

ui它在第一次单击后工作,但我仍然可以在运行应用程序时点击下载,然后禁用以启动并适当调整逻辑。它在第一次单击后工作,但我仍然可以在运行应用程序时点击下载,然后禁用以启动并适当调整逻辑。