Не удается обновить выбор выборки на стороне сервера с> 1000 вариантами выбора - PullRequest
2 голосов
/ 17 февраля 2020

У меня блестящее приложение, содержащее выборочный ввод на стороне сервера с длинным списком (> 10k) вариантов. Я хотел бы обновить выбор после нажатия кнопки. Вот воспроизводимый пример

library(shiny)

ui <- fluidPage(
  actionButton('buttonid','Button'),

  selectizeInput("listid", "A long list", choices = NULL)
  )

server <- function(input, output, session) 
  {
  updateSelectizeInput(session, "listid", choices = paste("Item", 1:10000), server = T)
  observeEvent(input$buttonid,
               {
               updateSelectizeInput(session, "listid", selected = "Item 1234")
               })
  }

shinyApp(ui = ui, server = server)

Приведенный выше код приводит к пустому выделению, когда я нажимаю кнопку. Однако, если я ищу «Элемент 1234», затем изменяю выбор и нажимаю кнопку, теперь элемент выбирается.

Кроме того, попытка выбрать элемент между Элементом 1 и 1000 не вызывает проблем, предположительно потому что в начале загружается 1000 элементов.

Это похоже на эту старую ошибку, но я не уверен, есть ли обходной путь https://github.com/rstudio/shiny/issues/1018

Ответы [ 2 ]

3 голосов
/ 21 февраля 2020

В кратком ответе явно указаны ваши choices и server в вашем обновлении.

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

  myChoices <- paste("Item", 1:10000)

  updateSelectizeInput(session, "listid", choices = myChoices, server = T)
  observeEvent(input$buttonid,
               {
                 updateSelectizeInput(session, "listid",
                                      server = TRUE,
                                      choices = myChoices,
                                      selected = "Item 1234")

               })
}

Значение по умолчанию для server в updateSelectizeInput равно FALSE. Это приводит к тому, что код помещается в оператор управления, который вместо этого использует updateSelectInput. Из кода функции

function (session, inputId, label = NULL, choices = NULL, selected = NULL, 
    options = list(), server = FALSE) 
{
    ...

    if (!server) {
        return(updateSelectInput(session, inputId, label, choices, 
            selected))
    }

   ...

Это отправляет сообщение клиенту, предполагая, что все варианты присутствуют (но, как вы упомянули, присутствуют только первые 1000).

Просто настройка server = TRUE приводит к ошибке при нажатии кнопки.

Warning: Error in [.data.frame: undefined columns selected
  [No stack trace available]

Я не полностью проследил причину, но в конечном итоге он создает пустой выбор data.frame с атрибутом, обозначающим выбранное значение. Я предполагаю, что где-то еще в вызовах функций к объекту session этот атрибут используется, чтобы попытаться выбрать столбец, созданный из пустого data.frame.

Функция обновления, по-видимому, не изменяет choices, хранящуюся на сервере, поэтому, по-видимому, она и возникает при поиске. Во время изменения выбранного значения кажется, что он пытается выбрать из NULL-списка вариантов вместо списка вариантов на сервере.

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

1 голос
/ 24 февраля 2020

Вы можете использовать maxOptions для отображения всех значений, может быть достаточно в зависимости от размера вашего выбора:

selectizeInput("listid", "A long list", choices = NULL, options = list(maxOptions = 10000))
...