选择器输入作为过滤器使用shinyJS禁用所有未禁用按钮

Posted

技术标签:

【中文标题】选择器输入作为过滤器使用shinyJS禁用所有未禁用按钮【英文标题】:pickerinput as filter disable all not disabling button using shinyJS 【发布时间】:2021-08-28 13:38:28 【问题描述】:

希望你保持安全。

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

我的代码有 5k 行,所以发布它是不行的。

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

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

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

我最初的策略有一个致命弱点,即使用过滤进行保存会覆盖 rhandsontable 中的所有数据。

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

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

下面是我的 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

【问题讨论】:

【参考方案1】:

要解决您的问题,您可以在单独的观察者中启用保存按钮,而不是在 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)

【讨论】:

这就像一个魅力......谢谢!显然需要单独的反应和观察,但吸取教训。

以上是关于选择器输入作为过滤器使用shinyJS禁用所有未禁用按钮的主要内容,如果未能解决你的问题,请参考以下文章

启用带有多个输入的选项卡并使用一个输入禁用选项卡

禁用输入,允许点击文本框

如果用户手动输入数据,如何禁用日历控件?

在绘图加载时禁用闪亮按钮

时间选择器禁用当前时间之前的时间

禁用分组单选操作按钮中的单个单选选项