【发布时间】:2022-08-05 00:10:14
【问题描述】:
我正在动态创建要插入fluidRow 的元素,我面临的问题是所有元素都被同时渲染。因此,它们不是在其renderUI 函数结束时渲染每个元素,而是一直等到最后一个renderUI 完成。因此,my_dataset 中有很多元素会使渲染变得非常缓慢。
我预计一旦显示print(str_glue(\'End: {i}\')),该元素就会被渲染。然而,情况并非如此,它一直在等待所有元素(包括那些在屏幕上不可见的元素)。
我尝试使用outputOptions(..., suspendWhenHidden = TRUE),但没有任何区别(正如预期的那样,因为这是默认设置)。
MWE
library(shiny)
library(shinydashboard)
library(dplyr)
library(tidyr)
library(purrr)
library(stringr)
library(shinycssloaders)
qtd <- 500
my_dataset <- data.frame(
stringsAsFactors = F,
Name = rep(\'Sample\', qtd),
Value = runif(qtd)
)
ui <- function() {
fluidPage(
fluidRow(
column(12, textInput(inputId = \'my_text_input\', label = NULL, placeholder = \'Search\', width = \'100%\')),
uiOutput(\'custom_ui\')
)
)
}
server <- function(input, output, session) {
output[[\'custom_ui\']] <- renderUI({
filtered_dataset <- my_dataset %>%
filter(grepl(input[[\'my_text_input\']], Name, ignore.case = T)) %>%
arrange(Name)
map(1:nrow(filtered_dataset), function(i) {
item <- filtered_dataset[i,]
custom_id <- str_glue(\'custom_id_{i}\')
output[[custom_id]] <- renderUI({
print(str_glue(\'Start: {i}\'))
print(item)
result <- box(
width = 3,
title = item$Name,
item$Value
)
print(str_glue(\'End: {i}\'))
result
})
column(width = 3, uiOutput(custom_id, style = \'height: 350px;\') %>% withSpinner(type = 6))
})
})
}
runApp(shinyApp(ui = ui, server = server), launch.browser = T)
-
你没有给我们 MWE,所以很难确定,但是...
renderUI是一个函数。它只会在它包含的所有代码都执行后才返回。因此,在你看到一切之前,你什么都看不到。提高速度的选项: (1) 将数据集的构建移到 renderUI 之外。 (这是一个很好的做法,我怀疑你无论如何都必须这样做。) 2 由于你有效地复制相同的接口(具有不同的数据)定义一个模块来表示接口并创建多个实例的模块以显示不同的数据切割。 -
@Limey 我添加了一个 MWE
标签: r shiny shiny-server