Shiny: How to stop processing invalidateLater() after data was abtained or at the given time

后端 未结 2 497
日久生厌
日久生厌 2020-12-11 12:14

I want to keep reflashing until 10:05, after 10:05 I got the tplus0_dt and stop to processing invalidaterLater().

Before 10:00, tplus0_dt doesn\'t exist, so I need

2条回答
  •  死守一世寂寞
    2020-12-11 12:36

    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$nis 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)
    

提交回复
热议问题