使用响应式表达式启用/禁用按钮

Posted

技术标签:

【中文标题】使用响应式表达式启用/禁用按钮【英文标题】:Enable/disable a button using a reactive expression 【发布时间】:2021-06-26 22:19:32 【问题描述】:

我正在开发一个闪亮的应用程序。我要求用户首先选择他/她想如何上传数据,通过文件或选择环境变量,使用单选按钮。 选择此项后,根据此选择,用户可以上传文件或选择变量。 我有一个按钮可以让应用程序根据用户提供的数据计算绘图。 我希望在提供数据之前禁用该按钮,但我无法根据存储用户数据的反应式表达式的存在来使 Shinyjs 启用该按钮。

这是一个例子:

library(shiny)

shinyApp(
    ui = fluidPage(
        useShinyjs(),
        radioButtons("dataSourceType", "Select data source:",
                     c("From file" = "file",
                       "From workspace" = "var")),
        conditionalPanel(
            condition = "input.dataSourceType == 'file'",
            fileInput("dataFile", "Choose data file:")
        ),
        conditionalPanel(
            condition = "input.dataSourceType == 'var'", 
            selectInput("dataVar", "Choose data var:",
                        ls(envir=.GlobalEnv))
        ),
        disable(actionButton("btn", "Click me")),
        textOutput("text")
        
    ),
    server = function(input, output) 
        data <- reactive(
            if(input$dataSourceType=="file")
                req(input$dataSourceType)
                return(read.csv(file=input$dataFile$datapath))
             else 
                req(input$dataVar)
                get(input$dataVar)
            
        )
        
        observe(
            if(isTruthy(data()))
                enable("btn")
             else 
                disable("btn")
            
        )
        
        observeEvent(input$btn, 
            output$text <- renderText(
                head(as.character(data()))
            )
        )
    
)

【问题讨论】:

【参考方案1】:

要禁用该按钮,当input$dataFile 中未提供用户文件时,您需要确保为data() 返回一个NULL 值。试试这个

library(shiny)
library(shinyjs)
library(DT)

shinyApp(
  ui = fluidPage(
    useShinyjs(),
    sidebarLayout(
      sidebarPanel(
        radioButtons("dataSourceType", "Select data source:",
                     c("From file" = "file",
                       "From workspace" = "var")),
        conditionalPanel(
          condition = "input.dataSourceType = 'file'",
          fileInput("dataFile", "Choose data file:")
        ),
        conditionalPanel(
          condition = "input.dataSourceType = 'var'", 
          selectInput("dataVar", "Choose data var:",
                      ls(envir=.GlobalEnv))
        ),
        actionButton("btn", "Click me")
      ),
      mainPanel(
        DTOutput("t1")
        #, textOutput("text")
      )
    )
  ),
  server = function(input, output,session) 
    data <- reactive(
      req(input$dataSourceType)
      if(input$dataSourceType=="file")
        if (is.null(input$dataFile)) return(NULL)
        else return(read.csv(file=input$dataFile$datapath, header=TRUE, sep=","))
       else 
        req(input$dataVar)
        get(input$dataVar)
      
    )

    observe(
      if(!is.null(data()))
        shinyjs::enable("btn")
      else 
        shinyjs::disable("btn")
      
    )
    
    observeEvent(input$btn, 
      req(data())
      output$text <- renderText(
        head(as.character(data()))
      )
      output$t1 <- renderDT(data())
    )
  
)

【讨论】:

以上是关于使用响应式表达式启用/禁用按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何在响应式设计中禁用缩放功能?

如何禁用 javascript 以进行响应式设计

您可以禁用 WordPress 上某些页面的响应式布局吗?

Vuejs:如何实现响应式禁用日期选择器

如何为 Fabric.js 启用响应式设计

在 Bootstrap 中禁用响应式(移动)导航栏