Ich habe auch dafür gesucht. Die meisten Menschen legen nahe, eine bedingte Panel wie folgt:
conditionalPanel(
condition="!($('html').hasClass('shiny-busy'))",
img(src="images/busy.gif")
)
Sie sich immer mehr Kontrolle geben könnte, und erstellen Sie die bedingte Handhabung (vielleicht auf mehr Material abhängig) wie dies in Ihrem ui.R:
div(class = "busy",
p("Calculation in progress.."),
img(src="images/busy.gif")
)
wo einige JavaScript, um das Ein- und Ausblenden der div Griff:
setInterval(function(){
if ($('html').attr('class')=='shiny-busy') {
$('div.busy').show()
} else {
$('div.busy').hide()
}
},100)
mit einigen zusätzlichen CSS können Sie Ihre animierten beschäftigen Bild bekommt eine feste Postion stellen Sie sicher, wo Es wird immer sichtbar sein. In jedem der oben genannten Fälle habe ich festgestellt, dass der Zustand "glänzend besetzt" etwas ungenau und unzuverlässig ist: das div zeigt für einen Bruchteil einer Sekunde und verschwindet, während Berechnungen noch laufen ... Ich fand eine schmutzige Lösung um dieses Problem zumindest in meinen Apps zu beheben. Fühlen Sie sich frei, es auszuprobieren und vielleicht könnte jemand einen Einblick geben, wie und warum dies das Problem löst.
In Ihrem server.R werden Sie brauchen zwei reactiveValues hinzuzufügen:
shinyServer(function(input, output, session) {
# Reactive Value to reset UI, see render functions for more documentation
uiState <- reactiveValues()
uiState$readyFlag <- 0
uiState$readyCheck <- 0
dann in Ihrer renderPlot Funktion (oder andere Ausgabefunktion, wo Berechnungen gehen), können Sie diese reaktiven Werte verwenden, die zum Zurücksetzen Funktion:
output$plot<- renderPlot({
if (is.null(input$file)){
return()
}
if(input$get == 0){
return()
}
uiState$readyFlag
# DIRTY HACK:
# Everytime "Get Plot" is clicked we get into this function
# In order for the ui to be able show the 'busy' indicator we
# somehow need to abort this function and then of course seamlessly
# call it again.
# We do this by using a reactive value keeping track of the ui State:
# renderPlot is depending on 'readyFlag': if that gets changed somehow
# the reactive programming model will call renderPlot
# If readyFlag equals readyCheck we exit the function (= ui reset) but in the
# meantime we change the readyFlag, so the renderHeatMap function will
# immediatly be called again. At the end of the function we make sure
# readyCheck gets the same value so we are back to the original state
isolate({
if (uiState$readyFlag == uiState$readyCheck) {
uiState$readyFlag <- uiState$readyFlag+1
return(NULL)
}
})
isolate({plot <- ...})
# Here we make sure readyCheck equals readyFlag once again
uiState$readyCheck <- uiState$readyFlag
return(plot)
})
Dieser Link ist tot ... –