【问题标题】:checkboxGroupInput - set minimum and maximum number of selections - tickscheckboxGroupInput - 设置最小和最大选择数 - 刻度
【发布时间】:2020-06-23 02:01:16
【问题描述】:

这里是带有复选框组输入的示例代码:

library(shiny)

server <- function(input, output) {
  output$Selected <- renderText({
    paste(input$SelecetedVars,collapse=",")
  })
}

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      checkboxGroupInput("SelecetedVars", "MyList:",
                         paste0("a",1:5), selected = "a1")
    ),
    mainPanel(textOutput("Selected"))
  )
)

shinyApp(ui = ui, server = server)

您可以从上图中看到,我们可以选择任意数量,在本例中为 5 个中的 4 个。

如何设置最小和最大刻度数?我需要至少检查 1 个选项,最多检查 3 个选项。即:防止取消勾选最后一次勾选,并防止在 3 个选项已经勾选时勾选。

【问题讨论】:

    标签: r checkbox shiny


    【解决方案1】:

    你可以这样做:

    library(shiny)
    
    my_min <- 1
    my_max <- 3
    
    ui <- fluidPage(
      sidebarLayout(
        sidebarPanel(
          checkboxGroupInput("SelecetedVars", "MyList:",paste0("a",1:5), selected = "a1")
        ),
        mainPanel(textOutput("Selected"))
      )
    )
    
    server <- function(input,output,session) {
    
      output$Selected <- renderText({
        paste(input$SelecetedVars,collapse=",")
      })
    
      observe({
        if(length(input$SelecetedVars) > my_max){
          updateCheckboxGroupInput(session, "SelecetedVars", selected= tail(input$SelecetedVars,my_max))
        }
        if(length(input$SelecetedVars) < my_min){
          updateCheckboxGroupInput(session, "SelecetedVars", selected= "a1")
        }
      })
    }
    
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 这会按照它们在 UI 中列出的顺序选择最后 2 个元素,而不是用户选择它们的顺序。我被这个绊倒了一个小时。
    【解决方案2】:

    您可以使用一点 JavaScript 来完成:

    ## In a file named 'js4checkbox.js' in your app folder :
    $(document).ready(function(){
      $('input[name=SelecetedVars]').on('click', function(event){
        if($('input[name=SelecetedVars]:checked').length > 3){
          $(this).prop('checked', false);
        }
      });
      $('input[name=SelecetedVars]').on('click', function(event){
        if($('input[name=SelecetedVars]:checked').length == 0){
          $(this).prop('checked', true);
        }
      });
    });
    

    并在您的ui 中添加:

    fluidPage(
      includeScript(path = "js4checkbox.js"),
      ...
    )
    

    我不知道为什么,但它在 RStudio 查看器中无法正常工作,因此请在浏览器中打开它。

    有关 JavaScript 代码,请参阅post

    【讨论】:

    • 惊人的答案。这基本上可以防止用户选中超过 3 个并取消选中所有框,对吧?
    • 这似乎不再起作用了。@Victorp,你知道为什么吗?
    • 抱歉,我正在尝试使用来自shinyWidgetscheckboxGroupButtons
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 2020-10-23
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    相关资源
    最近更新 更多