使用响应式表达式启用/禁用按钮
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())
)
)
【讨论】:
以上是关于使用响应式表达式启用/禁用按钮的主要内容,如果未能解决你的问题,请参考以下文章