R Shiny selectizeInput: установить минимум для количества входов - PullRequest
0 голосов
/ 27 июня 2018

У меня есть selectizeInput с multiple = TRUE в блестящем приложении, и я бы хотел, чтобы пользователь не выбрал NULL (т.е. оставил его пустым). Моя цель - убедиться, что выбран хотя бы один элемент (независимо от того, какой именно).

Я нашел этот вопрос по противоположной проблеме (т. Е. Ограничение максимум количество выборов) и проверил Выбор документации . К сожалению, похоже, нет опции minItems. Есть ли способ достичь желаемой функциональности?

Минимальный пример:

library(shiny)
shinyApp(

  ui = fluidPage(
    selectizeInput(
      inputId = "testSelect",
      label = "Test",
      choices = LETTERS[1:4],
      selected = LETTERS[1],
      multiple = TRUE,
      # Problem: how to specify 'minItems' here
      options = list(maxItems = 2)
    ),
    verbatimTextOutput("selected")
  ),

  server = function(input, output) {
    output$selected <- renderPrint({
      input$testSelect
    })
  }

)

1 Ответ

0 голосов
/ 27 июня 2018

Кажется, это открытый вопрос: # https://github.com/selectize/selectize.js/issues/1228.

Что касается вашей реализации R / Shiny, вы можете использовать обходной путь с renderUI().

Вы бы построили ввод на стороне сервера и управляли выбранными вариантами. Перед созданием ввода на стороне сервера вы можете проверить текущее значение и, если оно не соответствует вашим требованиям, вы можете перезаписать его:

selected <- input$testSelect
if(is.null(selected)) selected <- choices[1]

Воспроизводимый пример:

library(shiny)
choices <- LETTERS[1:4]  
shinyApp(
  ui = fluidPage(
    uiOutput("select"),
    verbatimTextOutput("selected")
  ),
  server = function(input, output) {
    output$selected <- renderPrint({
      input$testSelect
    })

    output$select <- renderUI({
      selected <- input$testSelect
      if(is.null(selected)) selected <- choices[1]
      selectizeInput(
        inputId = "testSelect",
        label = "Test",
        choices = choices,
        selected = selected,
        multiple = TRUE,
        options = list(maxItems = 2)
      )
    })
  }
)
...