pickerinput 作为过滤器禁用所有不禁用按钮使用 shinyJS

pickerinput as filter disable all not disabling button using shinyJS

希望你注意安全。

我搜索过类似的问题,但没有成功。

我的代码有 5000 行长,因此无法发布。

我会尽力提供尽可能多的信息。

简而言之,我有一些 pickerInputs 作为 rhandsontable 对象的反应过滤器。

我有一个保存按钮,用户可以保存他们的输入。

我最初的策略有一个致命弱点,那就是在打开过滤的情况下保存会覆盖 rhandsontable 中的所有数据。

因此,一个快速的解决方法是添加一个 observeEvent,其中仅当 pickerInput 选择了所有选项时才启用保存按钮(通过使用 ShinyJS)。

到目前为止一切顺利,但我注意到一个奇怪的行为:最初如果我们在 pickerInput 中单击“取消全选”,则保存按钮被禁用,但通过单击“Select 全部”(这会启用保存按钮)然后“取消全选”,保存按钮就不会被禁用。

下面是我的 observeEvent 代码。

以前有没有人出现过这种行为?

## having buttons disabled by default to account for null/empty statement
  shinyjs::disable("save_data_PCD_Metrics") 
  
  observeEvent(input$metricsTableEXCELPCDProject, {
    req(input$metricsTableEXCELPCDProject)
    print(length(input$metricsTableEXCELPCDProject))
    print(length(sort(unique(as.character(metricsTableEXCEL$Project)))))
    print(isTRUE(length(input$metricsTableEXCELPCDProject) == length(sort(unique(as.character(metricsTableEXCEL$Project))))))
    print(input$metricsTableEXCELPCDProject)
    
    ## having buttons disabled by default to account for null/empty statement
    shinyjs::disable("save_data_PCD_Metrics")
    
    ## toggle state of the button when condition of all projects selected 
    if(isTRUE(length(input$metricsTableEXCELPCDProject) == length(sort(unique(as.character(metricsTableEXCEL$Project)))))) {
      shinyjs::enable("save_data_PCD_Metrics")
    }
    
  })
  

最佳,

R

要解决您的问题,您可以在单独的观察器中启用保存按钮,而不是在 observeEvent 中。试试这个

library(shiny)
library(shinyjs)
library(shinyWidgets)

df1 <- data.frame(A=c(1:15),Y=c(16:30))

ui <- fluidPage(
  useShinyjs(),
  pickerInput("test",choices=list("A"=list(1,2,3,4,5),"B"=list(6,7,8,9,10), "C" = list(11,12,13,14,15)),
              options = list(`actions-box` = TRUE 
                             
                             ),
              multiple=TRUE),
  actionButton("savee", "Save"),
  textOutput("testOutput") 
)

server <- function(input, output) {
  
  shinyjs::disable("savee") 
  
  observeEvent(input$test, {
    req(input$test)
    print(length(input$test))
    #print(length(sort(unique(as.character(metricsTableEXCEL$Project)))))
    print(isTRUE(length(input$test) == length(sort(unique(as.character(df1$A))))))
    print(input$test)
    
    ## having buttons disabled by default to account for null/empty statement
    # shinyjs::disable("savee")
    
    ##  toggle state of the button when condition of all projects selected  
    ##  enabling within this observeEvent will not work
    # if(isTRUE(length(input$test) == length(sort(unique(as.character(df1$A)))))) {
    #   shinyjs::enable("savee")
    # }
    
  })
  
  saveme <- reactive({
    if(isTRUE(length(input$test) == length(sort(unique(as.character(df1$A)))))) saveme = 1 else saveme = 0
  })
   
  observe({
    if (saveme()) {shinyjs::enable("savee")  ## this works
    }else shinyjs::disable("savee")
    print(saveme())
  })
  
  output$testOutput <- renderText({paste(input$test)})
}

shinyApp(ui = ui, server = server)