Как обновить значение из CSV после обновления CSV на интервале в R? - PullRequest
0 голосов
/ 04 января 2019

РЕДАКТИРОВАТЬ: я сделал изменения, основанные на обратной связи ниже, но у меня все еще есть та же проблема с файлом не обновляется.Я обновил код, приведенный ниже, с правками, а также с функцией, которая затрудняла воспроизведение

У меня есть файл 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) Я не могу заставить приложение автоматически обновить файл и обновить пользовательский интерфейс.

Я ранее играл с IntervalLater, нопереключаясь на реактивныйFileReader, думая, что это может быть проще.Я прокомментировал некоторые варианты, которые я пробовал.

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)

При правильном выполнении пользовательский интерфейс обновит этот цвет до красного, зеленого или любого другого значения в любое время, когда изменится среднее значение в этом конкретном столбце (оценка).

1 Ответ

0 голосов
/ 04 января 2019

1) Кажется, что мое приложение читает файл из памяти, а не проверяет его снова каждый раз, когда я запускаю приложение

Вы неправильно вызываете файл после того, как онзагружено в реактивное переменное my_df

Вместо:

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

2) Я не могу заставить приложение автоматически обновить файл и обновить пользовательский интерфейс.

Вы запускаете серверный код только один раз, так как вы не используете никаких реактивных сред для повторного анализа результата.

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

Использование функции наблюдения с invalidateLater позволяет нам повторно запускать реактивное выражение с той же скоростью, с которой файл должен быть повторно загружен.

Примечание: я не могу проверить этокод как бы не воспроизводимый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...