SHINY:如何在获取数据后或在给定时间停止处理valalidateLater() [英] Shiny: How to stop processing invalidateLater() after data was abtained or at the given time

查看:8
本文介绍了SHINY:如何在获取数据后或在给定时间停止处理valalidateLater()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想一直刷新到10:05,在10:05之后,我得到了tplus0_dt并停止处理valalidaterLater()。

10:00之前,tplus0_dt不存在,所以我需要一直刷新到10:05。在10:05之后,不需要重新刷新,并且当tplus0_dt变得非常长时,inalidaterLater()将影响Table1的显示,屏幕和绘图每隔1秒变灰一次,因此当更新发生时,页面看起来就像是死了一样。(=

那么,如何停止处理invalidateLater()并在10:05之后继续显示数据呢?谢谢你的帮助!我的示例代码如下。

require(shiny)
require(data.table)
app <- shinyApp(
    server = function(input, output, session){
            get_tplus0_data <- reactive({
                    time <- substr(as.character(Sys.time()), 12, 16)
                    invalidateLater(1000)
                    if(time >= "10:05"){
                            # tplus0_dt<-data.table(read.csv("/data/df_highest_after_signal.csv",header = T, sep = ",", stringsAsFactors = F)) 
                            tplus0_dt<- data.table(a = c(1, 2, 3, 4), b = c(3, 4, 5, 8)) 
                            return(tplus0_dt)
                    }

            })
            output$table1 <- renderTable({get_tplus0_data()})
    },
    ui = fluidPage( tableOutput("table1")  )
)

runApp(app)

推荐答案

虽然您在精彩的文档中永远不会意识到这一点,但是invalidateLater()实际上只返回到您的反应式应用程序中一次。它似乎重复返回的原因是,在每次行程中,invalidateLater()函数再次运行。

因此解决方案是在函数周围使用条件,这样您就不会一直重复调用它:

if(runMeAgain) {
   invalidateLater(n)
}

runMeAgain = TRUE   # your reactive re-runs every n milliseconds
runMeAgain = FALSE  # your reactive does not re-run

还请注意:

  • invalidateLater()是非阻塞的(当您 等待)
  • invalidateLater()不会阻止被动方的睡觉 在奔跑。如果要在代码中的该点停止反应,请在invalidateLater()
  • 后面加上return()
  • invalidateLater()获取observeEvent()eventReactive()中的isolated(),因此不起作用;您必须使用observe()reactive()。它也可能在呈现函数中工作,但我从来没有理由尝试这样做。

就原始问题而言,反应性应如下所示:

get_tplus0_data <- reactive({
    time <- substr(as.character(Sys.time()), 12, 16)
    if(time >= "10:05"){
        tplus0_dt<- data.table(a = c(1, 2, 3, 4), b = c(3, 4, 5, 8)) 
        return(tplus0_dt)
    } else {
        invalidateLater(1000)
        return()
    }
})

这篇关于SHINY:如何在获取数据后或在给定时间停止处理valalidateLater()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆