2016-11-15 99 views
0

我正在編寫一些Shiny代碼,其中用戶將輸入一些輸入到應用程序,然後單擊一個操作按鈕。操作按鈕會觸發一系列需要很長時間才能運行的模擬,所以我希望一旦操作按鈕被點擊以使其被禁用,以便用戶在仿真運行之前不能繼續點擊它。我碰到了shinyjs::enableshinyjs::disable的功能,但一直在使用它們很難。這裏是我的服務器代碼:禁用Shiny中的按鈕

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

)} 

回答

4

我想您在同一個反應函數中使用shinyjs::disableshinyjs::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) 
+0

嗨Geovany,我根據你的建議更新了我的問題。仍然不適合我。介意看看是否只有一個簡單的錯誤? – RustyStatistician

+0

如果沒有問題的最小工作示例,很難知道問題是什麼。請提供任何人都可以執行的工作代碼。 – Geovany