19

我从数据库中初始加载数据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')  
                  )
           )
       )
    )
 )
)
4

3 回答 3

27

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)
于 2016-02-27T03:09:47.250 回答
9

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

然后我们可以在a 中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)
于 2016-02-25T23:06:28.743 回答
0

编码

hidden(
    div(
      id = "main_content",
      "Data loaded, content goes here"
    )

不适用于 tabsetPanel。但是,如果您将 id 移动到 div 级别,它会很好地工作。感谢 shinyjs 作者 Dean Attali 提供的这个技巧。https://stackoverflow.com/users/4432127/keshete

  hidden(
        div(id = "mainTabsetPanel",
          tabsetPanel(
....
于 2017-05-03T14:10:47.503 回答