一旦用户在 R shiny 中选择了多个选项,就禁用 selectinput

Disable selectinput once user selected multiple choices in R shiny

我有一个 select 多个输入 = TRUE,我需要在用户 select 多个选择后禁用 select 输入。但是,一旦我 select 第一选择,select 输入就被禁用,它不允许我 select 第二选择。我使用了以下代码。

library(shiny)
library(shinyjs)

ui <- fluidPage(
  br(),
  useShinyjs(),
  fluidRow(
    column(
      width = 6,
      selectInput(inputId = "check1", label = "Choose", choices = c("choice A","choice B","choice C"),multiple = T),
      verbatimTextOutput(outputId = "res1")
    )
  )
)
server <- function(input, output, session) {
  
  flag_lifecycle <- reactiveValues(val = "Yes")
  
  output$res1 <- renderPrint({
    input$check1
  })
  
  observeEvent(input$check1, {
    shinyjs::disable("check1")
  })
  
}
shinyApp(ui = ui, server = server)

我得到的输出

这里,select只有在select编辑了多项选择后才应该禁用输入。

在此感谢任何帮助。提前致谢!

在当前设置中,您实际上不知道用户何时完成 selection。

考虑各种场景-

  • 如果您在第一个 selection 后禁用,则用户无法 select 2 或 3 个值。
  • 如果您在第 2 个 selection 后禁用,则用户无法 select 3 个值。
  • 如果您在第 3 次之后禁用,那么如果用户只想 select 1 个值怎么办?

您永远不会知道何时根据值的长度禁用。我认为更好的选择是提供 actionButton 供用户在完成 selection 后提交。

library(shiny)
library(shinyjs)

ui <- fluidPage(
  br(),
  useShinyjs(),
  fluidRow(
    column(
      width = 6,
      selectInput(inputId = "check1", label = "Choose", 
                  choices = c("choice A","choice B","choice C"), multiple = T),
      verbatimTextOutput(outputId = "res1"), 
      actionButton('submit', 'Done')
    )
  )
)
server <- function(input, output, session) {
  
  flag_lifecycle <- reactiveValues(val = "Yes")
  
  output$res1 <- renderPrint({
    input$check1
  })
  
  observeEvent(input$submit, {
    shinyjs::disable("check1")
  })
  
}
shinyApp(ui = ui, server = server)

使用selectizeInput().

下面的函数为您的 selectizeInput() 添加了 2 个功能:

  • 能够删除已经做出的选择。
  • 限制可以选择的最大项目数。
# ----selectizeInput options---
selectizeOptions <- function (n = NULL) { # n is the max number of items
  if (is.null(n)) {
    list(
      plugins = list("remove_button")
    )
  }else {
    list(
      plugins = list("remove_button"), 
      maxItems = n
    )
  }
}

这是一个例子:

library(shiny)

ui <- fluidPage(
  # ----selections here----
  selectizeInput(
    inputId = "thechoices",
    label = "Choose",
    choices = LETTERS,
    selected = "A", 
    multiple = TRUE,
    options = selectizeOptions(n = 4)
  )
)

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

shinyApp(ui, server)