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