У меня есть приложение Shiny на основе Flexdashboard с несколькими вкладками, а внутри каждой вкладки - сетки из нескольких графиков.Производительность является проблемой, особенно при развертывании на бесплатном Shiny Server.
Первоначально основной проблемой было то, что нажатие на каждую вкладку потребовало бы повторного рендеринга графиков.Я установил для параметра suspendWhenHidden значение FALSE, и это помогает: теперь переключение входа имеет медленную задержку для загрузки всех графиков, но, по крайней мере, при навигации по интерфейсу производительность очень высокая.
Это заставило меня задуматься,однако - есть ли способ достичь гибрида двух типов поведения?Скажем, я на активной вкладке, которая просто производит один сюжет.Этот сюжет рендерит быстро.Можем ли мы сказать блестящему визуализировать этот график, отобразить его пользователю, а затем в фоновом режиме продолжить загрузку всех элементов других вкладок?В текущем состоянии активная вкладка не завершит рендеринг графика, пока все графики на скрытых вкладках также не будут отрисованы.
В общем, гибрид suspendWhenHidden = FALSE и TRUE:
ВизуализацияСначала активными элементами вкладок, которые отображаются для пользователя, затем продолжайте отображать элементы на скрытых вкладках. Я подумал, что, возможно, установка приоритета могла бы достичь этого, но, похоже, это не работает.Есть мысли или предложения?
Вот минимальный воспроизводимый пример.Цель состоит в том, чтобы первый график (на вкладке 1) отображался и появлялся до начала рендеринга второго графика (на вкладке 2). Но график должен начать отображаться на вкладке 2 без необходимости нажатия вкладки 2.
library(shiny)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
numericInput('n', 'Size', 10)
),
mainPanel(
tabsetPanel(
tabPanel("Tab1", plotOutput("plot1")),
tabPanel("Tab2", plotOutput("plot2"))))
)
)
# Define the server code
server <- shinyServer(function(input, output, session) {
output$plot1 <- renderPlot({plot(1:input$n)},height = 400,width=800)
output$plot2 <- renderPlot({ Sys.sleep(5); plot(1:input$n,col="red")},height = 400,width=800)
outputOptions(output, "plot2", suspendWhenHidden = FALSE)
})
# Return a Shiny app object
shinyApp(ui = ui, server = server)