R Shiny - 使用 updateSelectizeInput 优化页面加载时间

R Shiny - Optimize page loading time with updateSelectizeInput

我们闪亮的页面有多个 selectizeInput 控件,其中一些控件的下拉框中有很长的列表。因此,初始加载时间很长,因为它需要为所有 selectizeInput 控件预填充下拉框。

编辑:请参阅下面的示例,显示加载长列表如何影响页面加载时间。请直接复制以下代码和运行查看加载过程。

library(shiny)
library(shinydashboard)

ui <- dashboardPage(
dashboardHeader(title = "Basic dashboard"),
dashboardSidebar(
selectizeInput("a","filter 1",choices = sample(1:100000, 10000),multiple = T),
selectizeInput("b","filter 2",choices = sample(1:100000, 10000),multiple = T),
selectizeInput("c","filter 3",choices = sample(1:100000, 10000),multiple = T),
selectizeInput("d","filter 4",choices = sample(1:100000, 10000),multiple = T),
selectizeInput("e","filter 5",choices = sample(1:100000, 10000),multiple = T),
selectizeInput("f","filter 6",choices = sample(1:100000, 10000),multiple = T)
                ),
dashboardBody()
)

server <- function(input, output) {
}

shinyApp(ui, server)

所以我想在用户单击 see more filters 等特定复选框后更新那些 selectizeInput。但是,我不知道如何检测它是否已经加载了列表。

为了更清楚地解释这一点,请参阅下面的加载多个数据文件的解决方案。

#ui
checkboxInput("loadData", "load more data?", value = FALSE)

#server
#below runs only if checkbox is checked and it hasn't loaded 'newData' yet
#So after it loads, it will not load again 'newData'

if((input$loadData)&(!exists("newData"))){
    newData<<- readRDS("dataSample.rds")
}

但是如果是更新choises in selectizeInput:

#ui
selectizeInput("filter1","Please select from below list", choices = NULL, multiple = TRUE)

如何像我一样找到检测对象是否存在的条件 exists("newData")?我试过 is.null(input$filter1$choises) 但它不正确。

感谢对此情况的任何建议。

提前致谢!

最后我从 RStudio 上的 post 找到了解决方案。 http://shiny.rstudio.com/articles/selectize.html

# in ui.R
selectizeInput('foo', choices = NULL, ...)

# in server.R
shinyServer(function(input, output, session) {
updateSelectizeInput(session, 'foo', choices = data, server = TRUE)
})

When we type in the input box, selectize will start searching for the options that partially match the string we typed. The searching can be done on the client side (default behavior), when all the possible options have been written on the HTML page. It can also be done on the server side, using R to match the string and return results. This is particularly useful when the number of choices is very large. For example, when there are 100,000 choices for the selectize input, it will be slow to write all of them at once into the page, but we can start from an empty selectize input, and only fetch the choices that we may need, which can be much faster. We will introduce both types of the selectize input below.