обновление shinydashboard на регулярный интервал времени всякий раз, когда соответствующий файл данных CSV обновляется - PullRequest
0 голосов
/ 13 января 2019

У меня есть Shinydashboard, который отображает графики и поля на основе данных, представленных в одном файле CSV. Я запланировал обновление CSV на каждый 1 час. Но shinydashboard не обновляется, если я не обновляю его вручную или не запускаю снова (что вовсе не идеально).

Я пробовал invalidatelater (), но, похоже, он не работает.

Вот небольшой фрагмент.

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


`observe({

  invalidateLater(60000,session)

  isolate(Day<-read.csv("C:/Users/user1/Desktop/dashboardstuff/querycode.csv"))

  })

querycode - это имя CSV. Этот CSV обновляется каждые 60 минут, и я хочу, чтобы моя панель управления также обновлялась. Не уверен, что это правильный способ сделать это. Любая помощь будет оценена.

Просто чтобы поставить мой код,

ui<-dashboardPage(
dashboardHeader(title = "METRIC DASHBOARD"),
dashboardSidebar(
 useShinyjs(),
 sidebarMenu(
  id='tabs',
  menuItem("NA DAY COUNT", tabName = "tab1") ,
  menuItem("EU DAY COUNT", tabName = "tab2"),
  menuItem("JA DAY COUNT", tabName = "tab3"),
  menuItem("CUMULATIVE DAY COUNT", tabName = "tab4") ,
  menuItem("EU DEFECTS SUBMITTED", tabName = "tab5"),
  menuItem("NA DEFECTS SUBMITTED", tabName = "tab6") ,
  menuItem("JA DEFECTS SUBMITTED", tabName = "tab7") ,
  menuItem("Total DEFECTS SUBMITTED", tabName = "tab8"),
  menuItem("HOURLY PRODUCTIVITY", tabName = "tab9") ,
  menuItem("HOURLY DEFECTS SUBMITTED", tabName = "tab10")
 )),
dashboardBody(
tabItems(
  tabItem(
    tabName = 'tab1',
      highchartOutput("h1",height = 700)
    ),
  tabItem(
    tabName = 'tab2',
    highchartOutput("h2",height = 700)
  ),
  tabItem(
    tabName = 'tab3',
    highchartOutput("h3",height = 700)
  ),
  tabItem(
    tabName = 'tab4',
    highchartOutput("h4",height = 700)
  ),
  tabItem(
    tabName = 'tab5',
    highchartOutput("h5",height = 700)
  ),
  tabItem(
    tabName = 'tab6',
    highchartOutput("h6",height = 700)
  ),
  tabItem(
    tabName = 'tab7',
    highchartOutput("h7",height = 700)
  ),
  tabItem(
    tabName = 'tab8',
    highchartOutput("h8",height = 700)
  ))
)
)

tabnames = c('tab1', 'tab2','tab3','tab4','tab5','tab6','tab7','tab8')

А вот серверная часть,

Сервер <-функции (вход, выход, сессия) {</p>

observe({

  invalidateLater(60000,session)

  isolate(Day<-read.csv("C:/Users/user1/Desktop/dashboardstuff/querycode.csv"))

  })

# Day <- reactiveFileReader(60000*5,session,'C:/Users/pchintap/Desktop/dashboardstuff/querycode.csv',read.csv,header=TRUE)


# Day <- read.csv("C:/Users/user1/Desktop/dashboardstuff/querycode.csv")

  # })

strptime(Day$review_started_timestamp,"%Y-%m-%d %H:%M:%S")+5*3600+30*60->Day$review_started_timestamp
substr(Day$review_started_timestamp,6,7)->Day$Month
substr(Day$review_started_timestamp,1,10)->Day$date
strftime(Day$date,format = "%V")->Day$Week
Day$Week<-as.factor(Day$Week)
substr(Day$review_started_timestamp,12,13)->Day$starthour 

merge(Day,Associate.data%>%select("username","Q4.Manager","Project","Level","Q4.Shift","Region"),by.x = "username",all.x = TRUE)->Day
Day[complete.cases(Day),]->Day


output$h1<-renderHighchart({

  hourNA<-Day

Остальная часть кода - это просто манипулирование данными так, как я хочу. Но вот как я пытаюсь читать CSV "День". Я попробовал методы, упомянутые в комментариях. Но, похоже, это не работает.

1 Ответ

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

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

Исходя только из того, что я вижу в вашем коротком куске кода, я могу на 100% понять, почему то, что вы делаете, не работает: Day присваивается новому CSV-файлу внутри наблюдателя, но это так. не сохранять это значение за рамками наблюдения. Это связано с основными правилами области видимости в R, так же как если вы определяете переменную внутри одной функции, другая не связанная функция не может получить доступ к этой переменной. Но этот фрагмент кода запускается каждые 60 секунд (вы можете подтвердить это, поместив внутри оператор print и увидев, что он печатается каждую минуту, или вы можете даже сделать что-то вроде печати числа строк в наборе данных и видите, что он действительно читает новый набор данных каждую минуту).

Не видя вашего реального приложения, мне трудно сказать, как изначально определено Day и как его следует использовать, но есть три распространенных способа достижения людьми того, что вы пытаетесь сделать:

  1. Похоже, что вся причина для этого наблюдателя состоит только в том, чтобы прочитать файл и присвоить его переменной, поэтому я бы поспорил, что использование reactive() более уместно. Это означает что-то вроде этого:

    Day <- reactive({
      invalidateLater(60000, session)
      read.csv("C:/Users/user1/Desktop/dashboardstuff/querycode.csv")
    })
    

    И затем, когда вы захотите использовать эту переменную, вызовите Day()

  2. Аналогично, вы можете использовать reactiveVal или reactiveValues вместо reactive() функции. Я не буду останавливаться на разнице между использованием reactive() и reactiveValues (это выходит за рамки и совершенно отдельная тема, вот вопрос + ответ на этот вопрос ), но вот что это будет выглядеть например, как:

    rv <- reactiveValues()
    observe({
      invalidateLater(60000, session)
      rv$Day <- read.csv("C:/Users/user1/Desktop/dashboardstuff/querycode.csv")
    })
    

    И использовать rv$Day для доступа к этой переменной

  3. Поскольку это обычная проблема для многих, существует специальная функция: reactiveFileReader(). Вы можете использовать это так:

    Day <- reactiveFileReader(60000, session, "C:/Users/user1/Desktop/dashboardstuff/querycode.csv", read.csv)
    

    И используйте Day() для доступа к нему

...