R блестящий: создать реактивно выпадающий выбор или автозаполнение с несколькими наборами данных - PullRequest
0 голосов
/ 26 августа 2018

Я хотел бы предоставить пользователю возможность реактивно выпадающего выбора (предложения по автозаполнению) в зависимости от того, какие данные он вводит.Пользовательский ввод и предложения автозаполнения должны быть в одном виджете.

Проблема в том, что у меня большой набор данных (1 миллион строк +), из которого пользователь должен иметь возможность выбирать имена.Поскольку предварительная загрузка этого большого набора данных приведет к замедлению работы приложения, я хотел бы работать с несколькими разделенными наборами данных, которые я загружаю в зависимости от первой буквы пользовательского ввода.

Цель состоит в том, чтобы предоставить что-то вроде textInputвиджет, где пользователь может начать вводить имя.В зависимости от первой буквы этого пользовательского ввода, я хотел бы представить пользователю предложения, из которых он должен иметь возможность выбирать.

К сожалению, это невозможно с:

  • textInput (отсутствует раскрывающийся список с предложениями)
  • selectInput / selectizeInput / select2Input (отсутствует возможность работать с непредварительно загруженные данные)

Вот мои неудачные трейлы с различными входными виджетами, чтобы заставить это работать.

library(shiny)
library(shinysky)

#ui
ui <- fluidPage(

  #Text Input
  textInput(inputId = "txtInput", label = "Text Input", value = NULL),

  #Select Input
  selectInput(inputId = "selectInput", label = "Select Input", choices = NULL),

  #Selectize Input
  selectizeInput(inputId = "selectizeInput", label = "Selectize Input", choices = NULL),

  #Select2Input from shinysky
  select2Input(inputId = "select2Input", label = "Select2 Input", choices = NULL)
)

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

  #Create reactive values
  rv <- reactiveValues()

  #Function for loading specific data set
  f.populate.values <- function(start.letter) {

    data.set <- c()

    if(start.letter == "a") {

      #Example toy list
      data.set <- c("aaa", "abc", "adb", "adf") 
    }

    if(start.letter == "b") {

      #Example toy list
      data.set <- c("baa", "bbc", "bdb", "bdf") 
    }
    return(data.set)
  }

  #Failed trials to update / generate a dropdown with the loaded data set from "f.populate.values"
  observeEvent(input$txtInput, {

    #Store loaded data depending on first typed character
    rv$names <- f.populate.values(substring(input$txtInput, 1, 1))

    #Trials to update suggestions in widgets
    updateTextInput(inputId = "txtInput", value = rv$names, session = session)
    updateSelectInput(inputId = "selectInput", choices = rv$names, session = session)
    updateSelectizeInput(inputId = "selectizeInput", choices = rv$names, session = session)
    updateSelect2Input(inputId = "select2Input", choices = rv$names, label = "Select 2 Input", session = session)
  })
}

shinyApp(ui, server)
...