Как выбрать последние опции, выбранные пользователем с помощью блестящего флажка группы управления вводом - PullRequest
0 голосов
/ 13 января 2020

Я нашел решение в первом ответе на этот вопрос ( checkboxGroupInput - установить минимальное и максимальное количество выборов - отметки ) не работает должным образом. Воспроизводимый пример выглядит следующим образом:

rm(list = ls())
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)

При выборе флажков при go внизу списка новые выделения добавляются к хвосту входного вектора $ SelectedVars и, следовательно, к хвосту (input $ SelecetedVars, my_max) ) возвращает последние три переменные, выбранные пользователем. Однако, когда вы go создаете резервную копию списка, переменные добавляются к заголовку входного вектора $ SelectedVars, поэтому tail (input $ SelecetedVars, my_max) продолжает возвращать уже выбранные переменные.

Мой текущий патч - добавить заметку в мое приложение, в которой говорится, что одновременно можно выбрать только три переменные. Однако это зависит от того, что пользователь понимает, что он должен самостоятельно проверять переменные. Поэтому для простоты мне интересно, есть ли способ добавить самый последний выбранный var для добавления к хвосту вектора, чтобы вы всегда могли отобразить последние переменные, выбранные пользователем.

1 Ответ

0 голосов
/ 14 января 2020

Вы можете отслеживать выбранные флажки, чтобы узнать порядок элементов, добавленных последним в качестве реактивного значения. Когда вы превысите максимум, он удалит первый элемент (самый старый добавленный), но оставит флажок вновь добавленный. Точно так же, если вы снимите флажок, когда он отмечен только один (минимум), это предотвратит его удаление.

server <- function(input, output,session) {

  last_checked <- reactiveVal(NULL)

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

  observe({
    input$SelectedVars        
    isolate({
      if(length(input$SelectedVars) > my_max)
      {
        removed <- last_checked()[1]
      } else if(length(input$SelectedVars) < my_min)
      {
        removed <- NULL
      } else {
        removed <- c(setdiff(last_checked(), input$SelectedVars))
      }          
      complete <- c(last_checked(), c(setdiff(input$SelectedVars, last_checked())))
      last_checked(complete[!complete %in% removed])          
      updateCheckboxGroupInput(session, "SelectedVars", selected = last_checked())
    })

  })
}

Обратите внимание, что я исправил орфографию для input$SelecetedVars как input$SelectedVars.

Дайте мне знать, если это то поведение, которое вы искали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...