使用 `shinycssloaders::withSpinner` 覆盖多个输入

Use `shinycssloaders::withSpinner` to cover more than one input

我正在使用 shinycssloaders 来显示加载动画。页面上有多个从服务器加载的输入。这些输入也相互依赖。

在下面的示例中,我使用了一个反应对象来创建这种依赖关系。首先显示table,只有当table计算完成后(rv$a <- 1)绘图才能完成。

library(shiny)
library(shinycssloaders)

ui <- fluidPage(
    withSpinner(tableOutput('data')),
    withSpinner(plotOutput('plot'))
)

server <- function(input, output) {
  rv <- reactiveValues(a = NULL)
  
  output$data <- renderTable({
    #Some long calculation here, using Sys.sleep for simplicity
    Sys.sleep(2)
    rv$a <- 1
    head(mtcars)
  })
  
  output$plot <- renderPlot({
    req(rv$a)
    #Some long calculation here, using Sys.sleep for simplicity
    Sys.sleep(2)
    plot(rnorm(100), rnorm(100))
  })
}

shinyApp(ui, server)

这工作正常,但它显示了 2 个加载器,一个用于 table,另一个用于绘图。我想结合这 2 个加载器,只显示 1 个加载动画,它覆盖整个页面,结合 table 和绘图。此外,加载应仅在所有计算完成后结束,即在绘图计算后。

我试过将 table 和绘图放入 div 并在 div 上使用微调器,但它没有用,并给出了一个空白页。

ui <- fluidPage(
  withSpinner(div(
    tableOutput('data'),
    plotOutput('plot')
  ))
)

有人对此有解决方案吗?这可能使用一些不同的包吗?

您可以使用 tagList() 函数,它创建一个标签列表,允许 shinycssloaders 包一次性包装所有输入。

因此 ui 将如下所示:

ui <- fluidPage(
  withSpinner(tagList(tableOutput('data'),
          plotOutput('plot')))
)

Just some extra information for the animation. You can all change the style of the animation such as the the type, color, size , etc by adding these as arguments to the withSpinner(). Check the withSpinner() RDocumentation.