【问题标题】:Disable selectinput once user selected multiple choices in R shiny一旦用户在 R Shiny 中选择了多个选项,就禁用 selectinput
【发布时间】:2021-12-14 03:13:22
【问题描述】:

我有一个多个 = TRUE 的 selectinput,一旦用户选择多个选项,我需要禁用 selectinput。但是一旦我选择了第一个选项,selectinput 就会禁用,并且不允许我选择第二个选项。我使用了以下代码。

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)

我得到的输出

这里,只有在多选时才应该禁用 selectinput。

感谢您提供任何帮助。提前致谢!

【问题讨论】:

  • 在您的observeEvent() 中尝试disableafter &lt;- length(input$check1) if (disableafter &gt;= 2) shinyjs::disable("check1")
  • 感谢您的回复@YBS。当用户选择两个以上的选项时,它工作正常。如果用户只选择一个选项怎么办。
  • 那么它没有被禁用。

标签: r shiny shiny-reactivity


【解决方案1】:

使用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)

【讨论】:

    【解决方案2】:

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

    考虑各种场景 -

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

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

    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)
    

    【讨论】:

      猜你喜欢
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 2017-10-19
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多