2015-09-16 2 views
1

У меня есть actionButton() на моей веб-странице, которая делает некоторые вычисления, и заканчивается через 20 или 30 секунд.Только активируйте actionButton, когда приложение Shiny не занято

Есть ли способ отключить кнопку во время работы приложения? Или любой другой подход может быть интересным. Я спрашиваю об этом, потому что некоторые пользователи моего приложения дважды щелкают по actionButton, и я вижу на сервере, что вычисления выполняются дважды.

Спасибо!

ответ

4

Вы можете отключить кнопку после ее нажатия и включить ее при выходе. Это можно сделать вручную, но 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") 
      ) 
     }) 
    }) 
) 
+0

Через 4 секунды после u –

+0

Это происходит :) +1 от меня. – zero323

6

вы можете использовать отключить функциональность практически на все входы с функциональностью от shinyjs. Ниже я создал несколько интенсивную операцию, и кнопка будет деактивирована во время создания таблицы, чтобы пользователи не могли нажимать ее несколько раз, если сначала не создается выход.

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)) 

 Смежные вопросы

  • Нет связанных вопросов^_^