闪亮的小部件复选框组在输入时激活

Shiny widgets check box groups activating on enter

我正在尝试设计一个搜索功能,您可以在其中通过文本输入和复选框进行搜索(我使用的是 shinyWidgets),除了某些原因,当您在文本输入中按下回车键时,它会激活我的“ ALL/NONE”按钮。

目标是当按下 ALL/NONE 按钮时,它会在选中所有复选框和选中其中的 none 之间交替。问题是在文本框中按下回车似乎也激活了观察,即使它应该只通过按钮激活。

library(shiny) 
library(shinyWidgets)


Habitat <- c("grass", "water", "stone")
ID <- c(1, 2, 3)

data <- data.frame(ID, Habitat)


ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      width = 2,
      textInput("keyword_search", label = "Search by Keyword"),
      uiOutput("h_button"),
      uiOutput("habitat_filter")
    ),
    
    mainPanel(width = 10
    ))
)

server <- function(input, output, session) {

  output$habitat_filter <- renderUI({
    habitat_choices <- checkboxGroupInput(inputId = "habitat", label = "",
                                          choices = unique(data$Habitat[!is.na(data$Habitat)]),
                                          selected = unique(data$Habitat[!is.na(data$Habitat)]))
  })
  
  output$h_button <- renderUI({
    habitat_button <- checkboxGroupButtons(
      inputId = "habitat_switch",
      choices = "ALL / NONE",
      size = "sm",
      selected = "ALL / NONE")
  })
  
  observe({ #all/none button for habitats
    x <- input$habitat_switch
    if (!is.null(x)) {
      x <- unique(data$Habitat[!is.na(data$Habitat)])
    }
    else {
      x <- character(0)
    }
    
    updateCheckboxGroupInput(
      session,
      "habitat",
      label = NULL,
      choices = unique(data$Habitat[!is.na(data$Habitat)]),
      selected = x
    )
  })
}

shinyApp(ui = ui, server = server)

奇怪的是,如果在 sidebarLayout 之外进行编码,这个问题似乎就会消失。即如果 ui 边看起来像这样:

ui <- fluidPage(
      textInput("keyword_search", label = "Search by Keyword", width = '100%', placeholder = "Type here to search the archive..."),
      uiOutput("h_button"),
      uiOutput("habitat_filter")
)

不幸的是,我需要侧边栏,所以删除它不是解决问题的选项。有没有人有解决方案来防止连接这些功能?或者解释为什么会这样?

用这个替换我对按钮的观察似乎可以避免这里建议的问题:Select/Deselect All Button for shiny variable selection

observe({ #all/none button for habitats
  x <- unique(data$Habitat[!is.na(data$Habitat)])
  if (!is.null(input$habitat_switch) && input$habitat_switch >= 0) {
    if (input$habitat_switch %% 2 == 0) {
      x <- unique(data$Habitat[!is.na(data$Habitat)])
    }
    else {
      x <- character(0)
    }
  }

  updateCheckboxGroupInput(
    session,
    "habitat",
    label = NULL,
    choices = sort(unique(data$Habitat[!is.na(data$Habitat)])),
    selected = x
  )
})

最初仍然不知道是什么原因导致了这个问题,但这个解决方法似乎已经足够好了