R闪亮的reactiveValues()和invalidateLater()的奇怪行为

R闪亮的reactiveValues()和invalidateLater()的奇怪行为,r,shiny,R,Shiny,我有一个为仪表板可视化操作数据的用例。我希望在数据添加到数据库时,可视化会定期更新。我心目中的逻辑是首先检查live database表中的行数是否等于R中相应dataframe中的行数。如果是,则不需要提取数据,如果不是,则从数据库中提取数据。我想要避免的是周期性地拉取数据(实际数据库表有超过500万行),而不管是否有新数据 我已经创建了数据的一个子集。下面的代码是我写的一个概念证明,首先让我思考invalidaterater()和reactiveValues()如何在R中工作,以及如何使用它

我有一个为仪表板可视化操作数据的用例。我希望在数据添加到数据库时,可视化会定期更新。我心目中的逻辑是首先检查live database表中的行数是否等于R中相应dataframe中的行数。如果是,则不需要提取数据,如果不是,则从数据库中提取数据。我想要避免的是周期性地拉取数据(实际数据库表有超过500万行),而不管是否有新数据

我已经创建了数据的一个子集。下面的代码是我写的一个概念证明,首先让我思考
invalidaterater()
reactiveValues()
如何在R中工作,以及如何使用它们。它只读取数据库表中的行数并将其显示给用户。如果行数更改,用户界面将更新为新的行数。请注意,若要复制,您可能需要将数据放入数据库,以便可以模拟添加和删除行,以查看“应用程序”的反应。我使用了postgres和ODBC连接。如果按原样运行代码,您会注意到,当将行添加到数据库中时,当应用程序执行检查时,用户界面(
textOutput()
widget)会灰显几秒钟,并且在最终正确显示新的行数之前,似乎处于沉思状态。这使用的代码首先检查数据库和R中保存的值之间的行号是否存在差异

但是,如果我注释掉代码中检查差异的部分(注释掉下面的代码块)

sharedValues$data根据答案,这可以通过在ui.R中操作CSS来解决

tags$style(type="text/css",
  ".recalculating { opacity: 1.0; }"
)
#sharedValues$data <- nrow(sqlFetch(conn2,"test2"))
library(shiny)
library(shinydashboard)
library(rCharts)
library(curl)
library(RODBC)

conn2 <- odbcConnect("postgres") # database connection object

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(
    fluidRow(
      box(textOutput("text1"),width = 6)
    )
  )
)

server <- function(input, output, session) {  

  sharedValues <<- reactiveValues()
  observe({
    invalidateLater(30000,session)   
    cat("updating data...\n")
    sharedValues$data <- if(!is.null(sharedValues$data)){
      if(nrow(sqlFetch(conn2,"test2")) == sharedValues$data){
        return(sharedValues$data)
      }
    }
    else{
      sharedValues$data <- nrow(sqlFetch(conn2,"test2"))
      return(sharedValues$data)
    }

     #sharedValues$data <- nrow(sqlFetch(conn2,"test2"))
  })

  output$text1 <- renderText({

    y <- sharedValues$data
    return(y)

  })  

}

shinyApp(ui, server)
tags$style(type="text/css",
  ".recalculating { opacity: 1.0; }"
)