【问题标题】:Write table periodically at 20:00 each day每天20:00定时写表
【发布时间】:2016-02-18 07:40:22
【问题描述】:

情景描述: 我在服务器上启动并运行了一个闪亮的应用程序,该服务器通过每天更新的 SQL Server 连接到实时数据。

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

因此,理想的流程如下所示: day1 20:00 -->闪亮的应用程序重新运行,更新的数据被送入分析-->结果的备份表以csv形式保存在名为“Back-up 1”的目录中 day2 20:00 -->闪亮的应用程序重新运行,更新的数据被输入分析-->结果的备份表保存为 csv 在名为“Back-up 2”的目录中 等等……

我寻求的是 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/3 的服务器代码?

【问题讨论】:

  • 我想我的观点很清楚:我想知道如何自动编写一个连接到刷新应用程序的 csv 文件。我的 R 代码在这里无关紧要,虽然它不知道如何做我要求的事情,我没有尝试,因为我没有在网上找到参考,这就是我在这里问的原因。如果您一定需要从这里开始: write.table(x, file = "", append = FALSE, quote = TRUE, sep = " ", eol = "\n", na = "NA", dec = ".", row.names = TRUE, col.names = TRUE, qmethod = c("escape", "double"), fileEncoding = "")
  • 为什么这么生气?看看这个:stackoverflow.com/a/21548386/2923027
  • 嗯,现在我们谈谈。不生气只是这是我真正想解决的问题,我会看看这个,谢谢@MaxPD
  • 这根本不清楚,因为你甚至没有给你的操作系统。运行常规任务是操作系统的事情。
  • 感谢@Spacedman 的评论,在 MxPD 发表评论之前我不知道这一点

标签: r server shiny


【解决方案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 会永久检查其值以检测变化,并跟踪该变量的所有依赖关系。

解决方案:我的第一种方法是让失效只影响您的查询。然后这会以某种“级联”影响您的其他反应性环境。

这里是代码:

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.frames 的列表。

【讨论】:

  • 嗨@K.Rhode,不完全是我的想法,但一个很好的例子证明对我非常有用,非常感谢!接受为解决方案。
  • 我遇到了一个实现问题,你能看看我的问题的更新。非常感谢您的帮助!
  • 感谢您的回答!正如您指出的那样正确设置它。现在,它的工作原理是每次打开会话时都会写入数据。相反,我想我会把这个应用程序保持私有,只是为了数据写入而不是最初我计划在一个应用程序中拥有所有内容>备份、数据操作、分析和可视化......
  • @Patrik 该死的,我没想到。失效和东西总是依赖于客户。然后我建议再次拆分任务。让脚本使用 Windows 调度程序获取数据并将其存储在某处(例如,作为“df1.csv”)。而且您的闪亮脚本可以自动失效并重新加载此 csv 中的最新数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
相关资源
最近更新 更多