闪亮仪表板 - 显示专用的"加载..."页面,直到完成数据的初始加载

Kes*_*etE 14 r shiny shinydashboard shinyjs

我从数据库初始加载数据server.R需要几秒钟.在此之前,显示的页面会失真(选择框中的数据错误,框的奇怪位置,见下文). 显示扭曲

我希望在数据完全加载之前显示不同的页面(或至少在我的第一个显示的选项卡中显示不同的内容).

我想过做某种conditionalPanel使用基于专用的全局变量(initial_loading_done)的条件,但无论我试着放置conditionalPanel没有奏效.

这是我的UI.R的结构:

shinyUI(

  dashboardPage(
    dashboardHeader(title = "Title"),
    dashboardSidebar(
       sidebarMenu(
           menuItem("Tab1", tabName = "Tab1",icon = icon("dashboard")),
           menuItem("Tab2", tabName = "Tab2",  icon = icon("bar-chart-o"))
       )
    ),
    dashboardBody(
       includeCSS("custom_css.css"),
       tabItems(
           tabItem(tabName = "Tab1", 
                   fluidRow(<content>),
                   mainPanel(
                      fluidRow(<content>)
                   )
           ),
           tabItem(tabName = "Tab2",
                  fluidRow(<content>),
                  mainPanel(
                      dataTableOutput('my_data_table')  
                  )
           )
       )
    )
 )
)
Run Code Online (Sandbox Code Playgroud)

Dea*_*ali 22

这是一个使用shinyjs包的非常简单的例子

我们的想法是创建装载"页"和内容"页"下不同的ID,在内容页最初是隐藏的,并使用show()hide()之后的应用程序已准备就绪

library(shiny)
library(shinyjs)

load_data <- function() {
  Sys.sleep(2)
  hide("loading_page")
  show("main_content")
}

ui <- fluidPage(
  useShinyjs(),
  div(
    id = "loading_page",
    h1("Loading...")
  ),
  hidden(
    div(
      id = "main_content",
      "Data loaded, content goes here"
    )
  )
)

server <- function(input, output, session) {
  load_data()
}

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


Sym*_*xAU 6

server我喜欢用来reactiveValues()存储setupComplete条件.然后,当加载数据时,我setupComplete的设置为TRUE.

ui我们就可以评估这个setupComplete在一个条件conditionalPanel,并且只显示内容(在我的例子三个box()小部件).

这是一个有效的例子

## app.R ##
library(shiny)
library(shinydashboard)
library(shinyjs)

ui <- dashboardPage(
    dashboardHeader(),
    dashboardSidebar(),
    dashboardBody(
        actionButton(inputId = "btn_data", label = "Download"),
        conditionalPanel(condition = "output.setupComplete",
            box( title = "box1" ),
            box( title = "box2" ),
            box( title = "boc3" )
        ),
        conditionalPanel(condition = "!output.setupComplete",
                         box( title = "loading"))
    )
)

server <- function(input, output) { 

    rv <- reactiveValues()
    rv$setupComplete <- FALSE

    ## simulate data load
    observe({

        if(input$btn_data){

            df <- data.frame(id = seq(1,200),
                             val = rnorm(200, 0, 1))

            ## Simulate the data load
            Sys.sleep(5)
            ## set my condition to TRUE
            rv$setupComplete <- TRUE
        }

        ## the conditional panel reads this output
        output$setupComplete <- reactive({
            return(rv$setupComplete)
        })
        outputOptions(output, 'setupComplete', suspendWhenHidden=FALSE)

    })
}

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