使查询和数据框具有反应性并每 5 分钟刷新一次

make a query and data frame reactive and refresh it on every 5 minutes

//
library(plyr)
library(shiny)
library(ggplot2)
library(scales)
library(shinydashboard)
library(gridExtra)
library(DT)
library(ggthemes)
library(plotly)
library(data.table)
library(plotrix)
library(shinyjs)
library(shinycssloaders)

# connection with dash db
shinyServer(function(input, output, session) {

  # withProgress(message = 'Data Downloading',
  #              detail = 'This may take a while...', value = 0, {
  #                for (i in 1:15) {
  #                  incProgress(1/15)
  #                  Sys.sleep(10)
  #                }})

  dsn_driver = ""
  dsn_database = ""            # e.g. "BLUDB"
  dsn_hostname = "" # e.g.: "awh-yp-small03.services.dal.bluemix.net"
  dsn_port = "50000"                # e.g. "50000"
  dsn_protocol = "TCPIP"            # i.e. "TCPIP"
  dsn_uid = ""        # e.g. "dash104434"
  dsn_pwd = ""
  jcc = JDBC("com.ibm.db2.jcc.DB2Driver", "db2jcc4.jar");
  jdbc_path = paste("jdbc:db2://",  dsn_hostname, ":", dsn_port, "/", dsn_database, sep="");
  conn = dbConnect(jcc, jdbc_path, user=dsn_uid, password=dsn_pwd)

我想让这个查询每 5 分钟更新一次

query="select RETAIL_STORE.STR_NM as STR_NM,year(RETAIL_STR_SALES_DETAIL.SALE_DATE) as YEAR,month(retail_str_sales_detail.sale_date) as Monthnumber,
  monthname(RETAIL_STR_SALES_DETAIL.SALE_DATE) AS MONTHNAME,WEEK(RETAIL_STR_SALES_DETAIL.SALE_DATE) AS WEEKNAME
  ,RETAIL_STR_SALES_DETAIL.prod_id
  ,RETAIL_STR_SALES_DETAIL.PROD_NM as PROD_NM 
  ,retail_store_area_wise.area_name AS Area_Name
  ,SUM(RETAIL_STR_SALES_DETAIL.qty) AS QTY
  ,round(sum(RETAIL_STR_SALES_DETAIL.total),2) as TOTAL
  ,RETAIL_STORE_PRODUCT_HEMAS.MFG as MFG
  from RETAIL_STORE_PRODUCT_HEMAS
  INNER JOIN RETAIL_STR_SALES_DETAIL ON RETAIL_STORE_PRODUCT_HEMAS.prod_id = RETAIL_STR_SALES_DETAIL.prod_id
  INNER JOIN retail_dstr_prod ON retail_dstr_prod.prod_id = RETAIL_STR_SALES_DETAIL.prod_id
  INNER JOIN retail_store ON retail_store.store_id = RETAIL_STR_SALES_DETAIL.store_id
  INNER JOIN retail_store_area_wise ON retail_store_area_wise.store_id = RETAIL_STR_SALES_DETAIL.store_id
  where retail_dstr_prod.dstr_id='1495220190'
  group by RETAIL_STORE.STR_NM,RETAIL_STR_SALES_DETAIL.SALE_DATE
    ,year(RETAIL_STR_SALES_DETAIL.SALE_DATE)
    , monthname(RETAIL_STR_SALES_DETAIL.SALE_DATE)
    , RETAIL_STR_SALES_DETAIL.prod_id
    , RETAIL_STR_SALES_DETAIL.PROD_NM
    , retail_store_area_wise.area_name
    , RETAIL_STORE_PRODUCT_HEMAS.MFG 
    , RETAIL_STR_SALES_DETAIL.store_id
    , retail_store.store_id, WEEK(RETAIL_STR_SALES_DETAIL.SALE_DATE)
  ORDER BY year(RETAIL_STR_SALES_DETAIL.SALE_DATE),month(retail_str_sales_detail.sale_date),WEEK(RETAIL_STR_SALES_DETAIL.SALE_DATE)";
  rs=dbSendQuery(conn,query)   
  query1 <- fetch(rs, -1)

并使用查询刷新数据框

biz=data.frame(

    year=query1$YEAR,
    ProdNm=query1$PROD_NM,
    Total = as.numeric(as.character(query1$TOTAL)),
    Sold_that_day = query1$QTY,
    Month = query1$MONTHNAME,
    Weekand= query1$WEEKNAME,
    AreaName=query1$AREA_NAME,
    Manufacturer=query1$MFG,
    stringsAsFactors = FALSE
  )


  # Total sales By year In  2017 #


    totalsales="select year(RETAIL_STR_SALES_DETAIL.SALE_DATE) as YEAR,
      monthname(RETAIL_STR_SALES_DETAIL.SALE_DATE) AS MONTHNAME
      ,round(sum(RETAIL_STR_SALES_DETAIL.total),2) as TOTAL

      from retail_str_sales_detail where year(RETAIL_STR_SALES_DETAIL.SALE_DATE)='2017'
      group by year(RETAIL_STR_SALES_DETAIL.SALE_DATE),
      monthname(RETAIL_STR_SALES_DETAIL.SALE_DATE)";


      totalsalesbyyear <- fetch(dbSendQuery(conn,totalsales), -1)



          bizmonthly=data.frame(

                MonthName=factor(totalsalesbyyear$MONTHNAME,levels = month.name),
                Year=totalsalesbyyear$YEAR,
                MonthTotal=as.numeric(as.character(totalsalesbyyear$TOTAL))
              )

              print(bizmonthly)

像这样的东西应该可以解决问题。请注意,它将每 5 分钟全局更新一次,因此它不会在每个会话中触发。根据 reactiveTimer,每 10 秒检查一次时间。确保通过 biz()

访问 biz 的数据
library(shiny)

autoInvalidate <- reactiveTimer(10000,session = NULL)
Getupdates <- function(qfrequency){
  rs <- dbSendQuery(conn,query)   
  if(!exists("nextCall")){
    message("Initiating")
    query1 <<- fetch(rs, -1)
    nextCall <<- Sys.time() + qfrequency
    message("Got Initial Data")
  }
  else if (Sys.time() >= nextCall){
    message(paste0(Sys.time(), " Querying Periodically"))
    query1 <<- fetch(rs, -1)
    nextCall <<- Sys.time() + qfrequency
  }
  else{
    return()
  }
}

ui <- fluidPage(tableOutput("table"))

server <- function(input, output, session) {
  observe({
    autoInvalidate()
    # 300 is 5 mins
    Getupdates(300)
  })

  biz <- reactive({
    bizdata <- data.frame(
      year=query1$YEAR,
      ProdNm=query1$PROD_NM,
      Total = as.numeric(as.character(query1$TOTAL)),
      Sold_that_day = query1$QTY,
      Month = query1$MONTHNAME,
      Weekand= query1$WEEKNAME,
      AreaName=query1$AREA_NAME,
      Manufacturer=query1$MFG,
      stringsAsFactors = F
    )
    bizdata
  })

  output$table <- renderTable({biz()})
}

shinyApp(ui, server)