首页 > 解决方案 > 一旦CSV在R中的间隔更新,我如何刷新CSV中的值?

问题描述

编辑:我已经根据以下反馈进行了更改,但我仍然遇到文件不刷新的相同问题。我已经用编辑以及难以重现的功能更新了下面的代码

我有一个每 120 秒更新一次的 CSV 文件。然后我对该文件进行计算并更改 ui.r 中文本的颜色。

我真的在语法上苦苦挣扎,虽然我可以在启动应用程序、进行更改和重新启动应用程序时让一切正常工作,但我无法让我的应用程序自动更新。

下面的代码在控制台中一起执行时可以正常工作。所以我有信心我可以读取文件,进行计算并分配一个值。

source("BusinessLogic.R") #This contains getColor()
my_df <- read.csv("test.csv")
my_value <- mean(my_df$score)
ui_value <- getColor(my_value)
ui_value
>[1] "yellow"

但是在我的完整代码中,有两个问题:1)似乎我的应用程序正在从内存中读取文件,而不是每次启动应用程序时再次实际检查它

2) 我无法让应用程序自动刷新文件并更新 UI。

我以前玩过 IntervalLater 但切换到 reactiveFileReader 认为它可能更容易。我已经注释掉了我一直在尝试的一些变化。

library(shiny)

#source("BusinessLogic.R") #Contains function getColor() 
#my_df <- read.csv("test.csv")

ui <- htmlTemplate(
  text_ = '
  <html>
  <head> 
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <script type="application/shiny-singletons"></script>
  <script type="application/html- 
  dependencies">json2[2014.02.04];jquery[1.12.4];shiny[1.2.0]</script>
  </head>
  <body>
  <p style="color:{{ui_value}}">color</p>
  </body>
  </html>'
)
server <- function(input, output, session) {
  getColor <- function(x) {
    if (x > 80) {
      result <- "green"
    }
    else if (x > 50) {
      result <- "yellow"
    }
    else {
      result <- "red"
    }
    return(result)
  }
  my_df <- reactiveFileReader(1000, session, 'test.csv', read.csv)
  #my_df <- read.csv("test.csv")
  observe({
    invalidateLater(1000, session)
    my_value <- mean(my_df()$score)
    output$ui_value <- getColor(my_value)
  })
}
shinyApp(ui, server)

正确执行时,UI 会将此颜色更新为红绿色或任何时候该特定列(分数)中的平均值发生变化。

标签: rshiny

解决方案


1)似乎我的应用程序正在从内存中读取文件,而不是每次启动应用程序时都再次实际检查它

将文件上传到反应变量后,您没有正确调用文件my_df

反而:

my_df <- reactiveFileReader(1000, session, 'test.csv', read.csv)
    my_value <- mean(my_df()$score)

2) 我无法让应用程序自动刷新文件并更新 UI。

您只运行一次服务器代码,因为您没有使用任何反应式环境来重新分析结果。

observe({
 invalidateLater(1000, session)
 my_value <- mean(my_df()$score)
    output$ui_value <- getColor(my_value)
})

使用观察函数invalidateLater允许我们以与文件重新上传相同的速率重新运行反应式表达式。

注意:我无法测试此代码,因为它不可重现。


推荐阅读