仅在 Shiny 应用不忙时激活 actionButton
Only activate actionButton when Shiny app is not busy
我的网页中有一个 actionButton()
进行一些计算,它在 20 或 30 秒后完成。
有什么方法可以在应用 运行ning 时禁用该按钮?或者任何其他方法也可能很有趣。我问这个是因为我的应用程序的一些用户双击 actionButton
并且我可以在服务器中看到计算是 运行 两次。
谢谢!
您可以在单击按钮后将其禁用,然后在退出时再次启用。它可以手动完成,但 shinyjs
已经提供了所需的助手。
如果点击时调用的功能可能会失败,您可以使用 tryCatch
和 finally
来确保您的应用不会停留在禁用状态:
library(shiny)
library(shinyjs)
foo <- function() {
Sys.sleep(4)
x <- runif(1)
if(x < 0.5) stop("Fatal error")
print(x)
}
shinyApp(
ui=shinyUI(bootstrapPage(
useShinyjs(),
actionButton("go", "GO")
)),
server=shinyServer(function(input, output, session){
observe({
if(input$go == 0) return()
shinyjs::disable("go")
tryCatch(
foo(),
error = function(e) return(),
finally = shinyjs::enable("go")
)
})
})
)
您可以在几乎所有具有 shinyjs
包功能的输入上使用禁用功能。下面我创建了一些密集的操作,并且在生成 table 时按钮将停用,因此用户不能多次按下它,除非首先生成输出。
rm(list = ls())
library(shiny)
library(DT)
library(shinyjs)
ui =fluidPage(
useShinyjs(),
sidebarPanel(
sliderInput("numbers", "Number of records", 1000000, 5000000, 1000000, sep = ""),
actionButton("goButton","GO")
),
mainPanel(DT::dataTableOutput('table'))
)
server = function(input, output, session){
My_Data<-reactive({
if (is.null(input$goButton) || input$goButton == 0){return()}
isolate({
input$goButton
# Disable a button
disable("goButton")
# below is your intensive operation
a <- round(rnorm(input$numbers),2)
b <- round(rnorm(input$numbers),2)
# Enable a button again
enable("goButton")
data.frame("a" = a, "b" = b)
})
})
output$table <- DT::renderDataTable(withProgress(datatable(My_Data(),options = list(searching = FALSE,pageLength = 10,lengthMenu = c(5,10, 50))),message = "Generating Data"))
}
runApp(list(ui = ui, server = server))
我的网页中有一个 actionButton()
进行一些计算,它在 20 或 30 秒后完成。
有什么方法可以在应用 运行ning 时禁用该按钮?或者任何其他方法也可能很有趣。我问这个是因为我的应用程序的一些用户双击 actionButton
并且我可以在服务器中看到计算是 运行 两次。
谢谢!
您可以在单击按钮后将其禁用,然后在退出时再次启用。它可以手动完成,但 shinyjs
已经提供了所需的助手。
如果点击时调用的功能可能会失败,您可以使用 tryCatch
和 finally
来确保您的应用不会停留在禁用状态:
library(shiny)
library(shinyjs)
foo <- function() {
Sys.sleep(4)
x <- runif(1)
if(x < 0.5) stop("Fatal error")
print(x)
}
shinyApp(
ui=shinyUI(bootstrapPage(
useShinyjs(),
actionButton("go", "GO")
)),
server=shinyServer(function(input, output, session){
observe({
if(input$go == 0) return()
shinyjs::disable("go")
tryCatch(
foo(),
error = function(e) return(),
finally = shinyjs::enable("go")
)
})
})
)
您可以在几乎所有具有 shinyjs
包功能的输入上使用禁用功能。下面我创建了一些密集的操作,并且在生成 table 时按钮将停用,因此用户不能多次按下它,除非首先生成输出。
rm(list = ls())
library(shiny)
library(DT)
library(shinyjs)
ui =fluidPage(
useShinyjs(),
sidebarPanel(
sliderInput("numbers", "Number of records", 1000000, 5000000, 1000000, sep = ""),
actionButton("goButton","GO")
),
mainPanel(DT::dataTableOutput('table'))
)
server = function(input, output, session){
My_Data<-reactive({
if (is.null(input$goButton) || input$goButton == 0){return()}
isolate({
input$goButton
# Disable a button
disable("goButton")
# below is your intensive operation
a <- round(rnorm(input$numbers),2)
b <- round(rnorm(input$numbers),2)
# Enable a button again
enable("goButton")
data.frame("a" = a, "b" = b)
})
})
output$table <- DT::renderDataTable(withProgress(datatable(My_Data(),options = list(searching = FALSE,pageLength = 10,lengthMenu = c(5,10, 50))),message = "Generating Data"))
}
runApp(list(ui = ui, server = server))