每天20:00定期写表

时间:2016-02-18 07:40:22

标签: r server shiny

情境描述: 我通过每天更新的SQL Server连接到实时数据的24/7服务器上运行了一个闪亮的应用程序。

问题: 我想自动化表格编写过程并将其设置为每天20:00创建一个表格。 写入过程应该包括自动刷新闪亮的应用程序,因为它需要更新&从SQL源连接重新计算数字。

因此,理想过程将如下所示: day1 20:00 - >重新运行闪亮的应用程序,将更新的数据输入分析 - >将结果的备份表保存为名为'备份1'的目录中的csv day2 20:00 - >重新运行闪亮的应用程序,将更新的数据输入分析 - >将结果的备份表保存为名称为'备份2'的目录中的csv 等等...

我寻求的是R代码指示: 1如何定期写一个表 2如何定期刷新应用程序刷新

问题更新:根据以下建议创建响应式数据库连接: 实现的问题是,在我的Shiny应用程序中,我创建了3个反应数据集以便可视化数据,解决方案将是(我想象)在数据库的反应性中构建到3个反应数据集中的每一个,但是我想知道是否存在如何做到这一点将是一种智能的方式,而不需要重复相同的代码行3次。这是Shiny(不工作)的服务器端

##server.R##
server<-function(input,output, session){

MyData <- reactive({   
invalidateLater(86400000, session) 

#connect to the Server 
connection <- odbcConnect(dns, user, pass)
SituationToday<-{cat("test");sqlQuery(connection, "SELECT ALL * FROM   Table;")}
odbcClose(connection)

#data manipulation of SituationToday dataset including cleaning, filtering, joins, re-coding, labelling & as result I get 2 datasets
df1
df2

#backup
write.csv2(df1, paste0("filepath/Backup1", sys.Date(), ".csv"))
write.csv2(df2, paste0("filepath/Backup2", sys.Date(), ".csv"))

#reactive datasets that I need in order to visualise the data
data.df<-reactive({
VARIABLE<-input$variable
df1[df1$variable %in% VARIABLE,]})

data2.df<-reactive({
VARIABLE2<-input$variable2
df2[df2$variable2 %in% VARIABLE2,]})

data3.df<-reactive({
SELECT<-input$select
GROUP<-input$group
df1[df1$variable %in% SELECT & df1$GROUP %in% GROUP,]})
})

#different outputs follow
output$plot<-renderPlot({
  plot(data.df()) })
output$plot<-renderPlot({
  plot(data.df2()) })
output$plot<-renderPlot({
  plot(data.df3()) })
}

shinyApp(ui=ui,server=server)

如何在服务器功能中创建3个不同的反应数据集时保持连接无效,而不必在每个反应数据集中重复服务器代码的1 / 3rsd?

1 个答案:

答案 0 :(得分:1)

作为对@Patrik的评论的回答,这是一个关于我如何处理这些事情的例子:

(仅提供闪亮应用程序的服务器端.UI无需调整。)

server = function(input, output, session){

  YourData <- reactive({                   # Responds to changes. But in here, only the invalidation triggers change.
    invalidateLater(86400000, session)     # Invalidates YourData() after 86400000 millisecs = 24 hours.

    #-------- Some statements that gets Data from SQL Database, e.g. with library RODBC
    conn <- odbcDriverConnect("DNS=DB;UID=Usrname;PWD=12345")
    rawData <- sqlQuery(conn, "SELECT * FROM Table1")
    odbcClose(conn)

    #-------- Some statements that process your Data.
    rawData$value <- rawData$value * 2
    rawData$time <- strptime(rawData$time, format = "%Y-%m-%d %H:%M")

    #-------- Backup creation after data processing.
    write.csv2(rawData, paste0("filepath/Backup", sys.Date(), ".csv"))

    #-------- And finally call the Dataset you want to return to use in your Shiny-App
    rawData 
 })

  output$plot <- renderPlot({
    plot(YourData())
  })
}

有了这个,你的Shiny App就会继续运行,但会获取新数据,并且每24小时进行一次所有计算和备份。

它可能仍然有点抽象,但如果有任何不清楚的话,请随时询问。

对更新问题的反应

问题:MyData()不仅仅是一大块代码,而是一个具有正常R类的Object,存储为普通的R变量。但与其他变量相比,Shiny会永久检查其值以检测更改,并跟踪该变量的所有依赖项。

解决方案:我的第一种方法是让失效只影响您的查询。然后这会影响你的其他反应环境,在某种类型的&#34;级联&#34;。

这里的代码:

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

  # First, return only your SQL results

  MyData <- reactive({   
    invalidateLater(86400000, session) 

    #connect to the Server 
    connection <- odbcConnect(dns, user, pass)
    SituationToday<-{cat("test");sqlQuery(connection, "SELECT ALL * FROM   Table;")}
    odbcClose(connection)

    SituationToday
  })

  # Second, manipulate you dataframes 1 and 2

  df1 <- reactive({
    SituationToday <- MyData()        # Reacts whenever MayData() changes

    #data manipulation of SituationToday dataset including cleaning, filtering, joins, re-coding, labelling
    # Resulting in your Set df1

    #backup
    write.csv2(df1, paste0("filepath/Backup1", sys.Date(), ".csv"))

    # Return the dataframe
    df1
  })

  # Same for df2

  df2 <- reactive({
    SituationToday <- MyData()        # Reacts whenever MayData() changes

    #data manipulation of SituationToday dataset including cleaning, filtering, joins, re-coding, labelling
    # Resulting in your Set df2

    #backup
    write.csv2(df2, paste0("filepath/Backup2", sys.Date(), ".csv"))

    # Return the dataframe
    df2
  })

  #reactive datasets that I need in order to visualise the data

  data.df <- reactive({
    VARIABLE<-input$variable              # Reacts to input
    df1()[df1()$variable %in% VARIABLE,]  # As well as change in df1()
  })

  data2.df<-reactive({
    VARIABLE2<-input$variable2              # Reacts to input
    df2()[df2()$variable2 %in% VARIABLE2,]  # As well as change in df2()
  })

  data3.df<-reactive({
    SELECT<-input$select
    GROUP<-input$group
    df1()[df1()$variable %in% SELECT & df1()$GROUP %in% GROUP,] # Again df1() dependant
  })

  #different outputs follow

  output$plot<-renderPlot({
    plot(data.df()) })
  output$plot<-renderPlot({
    plot(data.df2()) })
  output$plot<-renderPlot({
    plot(data.df3()) })
}

如果您因为必须拆分创建df1df2而感到非常恼火,您还可以考虑返回2 data.frame的列表。