Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

checkboxGroupInput - set minimum and maximum number of selections - ticks

Tags:

checkbox

r

shiny

Here is example code with check-box group input:

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)

enter image description here

As you you can see from image above we can select as many as we want, in this case 4 out of 5.

How can I set minimum and maximum number of ticks? I need minimum of 1 option checked and maximum of 3 options checked. i.e.: prevent unticking the last tick, and prevent ticking when 3 options were already ticked.

like image 823
zx8754 Avatar asked Jun 30 '15 13:06

zx8754


2 Answers

You can use a little JavaScript to do it:

## 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);
    }
  });
});

And in your ui add:

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

I don't know why but it doesn't work well in the RStudio Viewer so open it in your browser.

For the JavaScript code see this post

like image 100
Victorp Avatar answered Nov 19 '22 09:11

Victorp


You can do something like this:

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)
like image 36
Pork Chop Avatar answered Nov 19 '22 08:11

Pork Chop