CSV在R中的时间间隔更新后,如何从CSV刷新值?

时间:2019-01-03 22:34:05

标签: r shiny

编辑:我已经根据下面的反馈进行了更改,但是我仍然遇到相同的问题,文件没有刷新。我已经通过修改以及难以复制的功能更新了以下代码

我有一个CSV文件,该文件每120秒更新一次。然后,我将对此文件进行计算,并更改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,但切换到reactFileReader可能会更容易。我已经注释掉了我一直在尝试的一些变体。

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会将该颜色更新为红绿色或任何时候该特定列(分数)中的平均值发生变化。

1 个答案:

答案 0 :(得分:1)

  

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配合使用可使我们以应重新上传文件的相同速率重新运行反应式表达式。

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