浏览器中较大的数据(约15,000个条目)上的闪亮selectInput非常慢

Gop*_*ala 12 r shiny

我有这个基本的闪亮应用程序,它在'查看器'中非常快速,但是当我使用"在浏览器中打开"选项时,选择输入选项需要一段时间才能加载.

selectList <- sapply(1:15000, function(x) paste(sample(letters, 10), collapse = ''))
ui <- fluidPage(
  selectInput('mylist', 'Select Something',
              choices = c(Choose = '', selectList),
              selected = 1)
)

server <- function(input, output) {
}

shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)

根据这个帖子 - https://groups.google.com/forum/#!topic/shiny-discuss/doHpFM6ZOGg,该问题在一些旧的私人分支中有一个修复.我正在使用的最新安装是这个,我看到了缓慢的问题.

packageVersion('shiny')
[1] ‘0.13.2’
Run Code Online (Sandbox Code Playgroud)

我必须做出的任何选择都有不同的表现吗?

额外需要:

我还希望选择的输入依赖于单选按钮输入,如下所示.但是,由于某种原因,我不能让服务器端选择输入与单选按钮上的observeEvent一起使用.对我做错了什么的想法?

# mylist
selectList1 <- sapply(1:15000, function(x) paste0(x, "_", paste(sample(LETTERS, 10), collapse = '')))
selectList2 <- sapply(1:15000, function(x) paste0(x, "_", paste(sample(letters, 10), collapse = '')))

# ui
ui <- fluidPage(
  selectizeInput(
    inputId = 'mylist', label = 'Select Something',
    choices = NULL,
    selected = 1
  ),
  radioButtons('letterType',
               'Select a Letter Type:',
               choices = c('Upper Case' = 'upper',
                           'Lower Case' = 'lower'),
               selected = 'upper',
               inline = TRUE)
)

# server
server <- function(input, output, session) {
  selectListReactive <- reactive({
    validate(need(is.null(input$letterType), FALSE))
    if (input$letterType == 'upper')
      selectList1
    else
      selectList2
  })
  observeEvent(input$letterType, {
    updateSelectizeInput(session = session, inputId = 'mylist',
                         choices = c(Choose = '', selectListReactive()),
                         server = TRUE)
  })
}

# app
shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)

Vic*_*orp 23

嗨尝试将选项放在服务器中updateSelectizeInput并用于server = TRUE存储服务器端的选项,例如:

library("shiny")
# mylist
selectList <- sapply(1:15000, function(x) paste0(x, "_", paste(sample(letters, 10), collapse = '')))
# ui
ui <- fluidPage(
  selectizeInput(
    inputId = 'mylist', label = 'Select Something',
    choices = NULL,
    selected = 1
  )
)
# server
server <- function(input, output, session) {
  updateSelectizeInput(session = session, inputId = 'mylist', choices = c(Choose = '', selectList), server = TRUE)
}
# app
shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)

您必须使用selectizeInput而不是selectInput为此工作


dan*_*ulo 5

我使用data.table包更快地完成了它:

library(data.table)
selectList <- as.data.table(sapply(1:15000, function(x) paste(sample(letters, 10), collapse = '')))
ui <- fluidPage(
  selectInput('mylist', 'Select Something',
              choices = c(Choose = '', selectList),
              selected = 1)
)

server <- function(input, output) {
}

shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)

这可能是值得的

  • 您不应该将 selectList$V1 作为输入,因为它是一个字符向量并且效率低下。您必须提供 selectList,它是一个包含 15000 行和一列的 data.table,并且效率更高。它在浏览器中对我有用。只需复制并粘贴我的脚本并检查它 (4认同)
  • 这比其他解决方案效果更好,因为服务器端渲染似乎会导致滞后。 (3认同)
  • 这使我的一切都快了1000倍.服务器端的某些用途仍然可能很好,但这对我来说有大约50,000个选择. (2认同)
  • 通过这种方法可以大大提高速度!然而,我得到了“。” 使用此选项位于选择列表的顶部。有办法去掉吗? (2认同)