我正在编写一些Shiny代码,用户将在该应用程序中输入一些输入,然后单击一个操作按钮。操作按钮会触发一系列模拟运行需要很长时间,所以我想在单击操作按钮后将其禁用,以便用户在模拟运行之前无法一直点击它。我遇到了shinyjs::enable
和shinyjs::disable
函数,但一直很难利用它们。这是我的服务器代码:
output$button1= renderUI({
if(input$Button1 > 0) {
shinyjs::disable("Button1")
tableOutput("table")
shinyjs::enable("Button1")}
})
但是,当我使用此代码时,单击操作按钮没有任何反应。即,操作按钮不会变灰,也不会生成表格。但是,当我拿走shinyjs::enable()
命令时,即
output$button1= renderUI({
if(input$Button1 > 0) {
shinyjs::disable("Button1")
tableOutput("table")
}
})
首先生成表格,然后按钮变为灰色,但是我希望按钮变灰,然后表格生成自己。
我在这里做错了什么?
以下是基于Geovany建议的更新代码,但仍然不适用于我
Button1Ready <- reactiveValues(ok = FALSE)
observeEvent(input$Button1, {
shinyjs::disable("Button1")
RunButton1Ready$ok <- FALSE
RunButton1Ready$ok <- TRUE
})
output$SumUI1= renderUI({
if(Button1Ready$ok){
tableOutput("table")
shinyjs::enable("Button1")
}
})
在澄清的地方我也有:
output$table <- renderTable({
#My code....
)}
答案 0 :(得分:9)
我认为您在同一个被动功能中使用shinyjs::disable
和shinyjs::enable
。你只会看到最后的效果。我建议你将disable/enable
分成不同的反应函数,并使用一些额外的反应变量来控制按钮的重新激活。
我不知道您的代码究竟是多么准确,但在下面的代码中说明了这个想法。
library(shiny)
library(shinyjs)
ui <- fluidPage(
shinyjs::useShinyjs(),
sidebarLayout(
sidebarPanel(
actionButton("Button1", "Run"),
shinyjs::hidden(p(id = "text1", "Processing..."))
),
mainPanel(
plotOutput("plot")
)
)
)
server <- function(input, output) {
plotReady <- reactiveValues(ok = FALSE)
observeEvent(input$Button1, {
shinyjs::disable("Button1")
shinyjs::show("text1")
plotReady$ok <- FALSE
# do some cool and complex stuff
Sys.sleep(2)
plotReady$ok <- TRUE
})
output$plot <-renderPlot({
if (plotReady$ok) {
shinyjs::enable("Button1")
shinyjs::hide("text1")
hist(rnorm(100, 4, 1),breaks = 50)
}
})
}
shinyApp(ui, server)