更新2018年:目前有一个很好的包可以帮助您显示加载器:shinycssloaders
(来源:https://github.com/andrewsali/shinycssloaders)
我也一直在寻找这个功能。大多数人建议使用条件面板如下:
conditionalPanel(
condition="!($('html').hasClass('shiny-busy'))",
img(src="images/busy.gif")
)
你可以随时增加自己的控制并在ui.R中像这样创建条件处理(也许取决于更多内容):
你总是可以给自己更多控制,并在ui.R中创建条件处理(也许要依赖更多的东西),如下所示:
div(class = "busy",
p("Calculation in progress.."),
img(src="images/busy.gif")
)
这里有一些 JavaScript 处理显示和隐藏该 div 的操作:
setInterval(function(){
if ($('html').attr('class')=='shiny-busy') {
$('div.busy').show()
} else {
$('div.busy').hide()
}
},100)
通过一些额外的CSS,您可以确保动画忙碌图像获得固定位置,始终可见。
在上述任何情况下,我发现“shiny-busy”状态有些不精确和不可靠:当计算仍在进行时,div会显示一小段时间,然后消失...我找到了一个不太优美的解决方案来解决这个问题,至少在我的应用程序中是如此。请随意尝试并且也许有人可以给出为什么以及如何解决该问题的见解。
在您的server.R中,您需要添加两个reactiveValues:
shinyServer(function(input, output, session) {
uiState <- reactiveValues()
uiState$readyFlag <- 0
uiState$readyCheck <- 0
然后,在您的 renderPlot 函数中(或其他进行计算的输出函数中),您可以使用这些反应式值重新设置函数:
output$plot<- renderPlot({
if (is.null(input$file)){
return()
}
if(input$get == 0){
return()
}
uiState$readyFlag
isolate({
if (uiState$readyFlag == uiState$readyCheck) {
uiState$readyFlag <- uiState$readyFlag+1
return(NULL)
}
})
isolate({plot <- ...})
uiState$readyCheck <- uiState$readyFlag
return(plot)
})
withSpinner(plotOutput(“Test”))
。 - KaterenderUI({ withProgress(..., {plotOutput(...) %>% shinycssloaders::withSpinner()})})
中也是如此。 - Brian D