How about you override the function to your needs?
If you enter invalidateLaterNew
in the console, the code of the function will be printed.
To overwrite a function within a package this post will help: Override a function that is imported in a namespace
Then you will have to consider that the functions .getReactiveEnvironment()
and timerCallbacks()
are not accessible outside the namespace. But you can call them like this: shiny:::.getReactiveEnvironment()
Bring it together:
You add an additional parameter (e.g. update
), which will enable you to stop the invalideLater()
whenever you want.
invalidateLaterNew <- function (millis, session = getDefaultReactiveDomain(), update = TRUE)
{
if(update){
ctx <- shiny:::.getReactiveEnvironment()$currentContext()
shiny:::timerCallbacks$schedule(millis, function() {
if (!is.null(session) && session$isClosed()) {
return(invisible())
}
ctx$invalidate()
})
invisible()
}
}
unlockBinding("invalidateLater", as.environment("package:shiny"))
assign("invalidateLater", invalidateLaterNew, "package:shiny")
Example:
I used the example given in ?invalidateLater
to demonstrate the effect:
(invalidateLater
will stop when input$n
is bigger than 800. So you can adapt this example to your time restriction).
I decided not to use your time restriction example as it wouldnt be that handy to test ;)
ui <- fluidPage(
sliderInput("n", "Number of observations", 2, 1000, 500),
plotOutput("plot")
)
server <- function(input, output, session) {
observe({
# Re-execute this reactive expression after 1000 milliseconds
invalidateLater(1000, session, input$n < 800)
# Do something each time this is invalidated.
# The isolate() makes this observer _not_ get invalidated and re-executed
# when input$n changes.
print(paste("The value of input$n is", isolate(input$n)))
})
# Generate a new histogram at timed intervals, but not when
# input$n changes.
output$plot <- renderPlot({
# Re-execute this reactive expression after 2000 milliseconds
invalidateLater(2000, session, input$n < 800)
hist(rnorm(isolate(input$n)))
})
}
shinyApp(ui, server)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…