Enable/disable 使用响应式表达式的按钮

Enable/disable a button using a reactive expression

我正在开发一个闪亮的应用程序。我要求用户首先选择 he/she 想要如何上传数据,通过文件或选择环境变量,使用单选按钮。
一旦 selected,根据这个选择,用户可以上传文件或 select 变量。
我有一个按钮可以让应用程序根据用户提供的数据计算绘图。 我希望在提供数据之前禁用该按钮,但是我无法根据存储用户数据的反应表达式的存在使 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()))
            })
        })
    }
)

要禁用该按钮,当 input$dataFile 中未提供用户文件时,您需要确保 return 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())
    })
  }
)