Skip to content

Instantly share code, notes, and snippets.

@alandipert
Created May 31, 2018 18:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alandipert/a784eec164c34ca5ae4bc965765266d1 to your computer and use it in GitHub Desktop.
Save alandipert/a784eec164c34ca5ae4bc965765266d1 to your computer and use it in GitHub Desktop.
library("shiny")
library("shinyWidgets")
fruits <- c("Banana", "Blueberry", "Cherry", "Coconut", "Grapefruit", "Kiwi", "Lemon", "Lime", "Mango", "Orange", "Papaya")
pickerMaker <- function(selected = c(), selectedText = "{0}/{1} fruits") {
pickerInput(
inputId = "picker",
label = "Choices :",
choices = fruits,
selected = selected,
options = list(
`actions-box` = TRUE,
`selected-text-format` = "count > 2",
`count-selected-text` = selectedText
),
multiple = TRUE
)
}
ui <- fluidPage(
titlePanel("Fruit Explorer"),
sidebarLayout(sidebarPanel(uiOutput("picker")),
mainPanel(textOutput("res")))
)
server <- function(input, output) {
nTotal <- length(fruits)
nPrevSelected <- reactiveVal(0)
nSelected <- reactive(length(input$picker))
observe(nPrevSelected(length(input$picker)))
pickerState <- reactive({
if (nPrevSelected() < nTotal && nSelected() == nTotal) {
"toTotal"
} else if (nPrevSelected() == nTotal && nSelected() < nTotal) {
"fromTotal"
} else if (nSelected() > 0) {
"noop"
} else {
"init"
}
})
output$picker <- renderUI({
switch(pickerState(),
toTotal = pickerMaker(input$picker, "Total"),
fromTotal = pickerMaker(input$picker),
noop = req(FALSE, cancelOutput = TRUE),
init = pickerMaker())
})
output$res <- renderPrint({
input$picker
})
}
shinyApp(ui = ui, server = server)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment