Как привязать новые строки к таблице данных через определенные промежутки времени в Shiny Dashboard? - PullRequest
0 голосов
/ 12 июня 2018

Я создаю блестящее приложение с 2 выходами datatableoutput и plotoutput. У меня есть 2 переменные st и et во фрейме данных, которые будут инициализированы значением, мне нужно добавить новые строки всуществующий фрейм данных, имеющий следующую логику
1. Новое значение st является предыдущим значением et.
2. Новое значение et является предыдущим значением st - 1000.
3.Новые значения st и et должны добавляться как новая строка в моем фрейме данных каждые 5 секунд.
На основе вновь добавленных строк линейный график должен обновляться.

Ниже приведены мои коды ui.r и server.r, в настоящее время я могу создавать новые значения st и et в соответствии с логикой, но не смог добавить новые строки и построить график

Ui.r

 library(shiny)

shinyUI(fluidPage(

 titlePanel("Incremental Plots"),

 sidebarLayout(
   sidebarPanel(),

   mainPanel(
      tableOutput('var')
    )
  )
))

Server.r

library(shiny)
start_time <- 100000
end_time <- start_time - 1000
shinyServer(function(input,output,session){
   omega <- reactive({
    invalidateLater(1000, session)

   #dataf <<- data.frame(st = c(start_time),et = c(end_time))
   return(dataf)
   })

  # update non reactive value
   observe({
    omega()
    start_time <<- end_time
    end_time <<- start_time - 1000
    dataf <<- data.frame(st = start_time,et = end_time)


  })

  output$var <- renderTable(omega())
})

1 Ответ

0 голосов
/ 12 июня 2018

Для этого вы можете использовать комбинацию reactiveVal и observe.Обратите внимание, что вы можете вызвать значение reactiveVal с именем x с помощью x(), и вы можете установить его значение на y, выполнив x(y).Рабочий пример приведен ниже, надеюсь, это поможет!


enter image description here


library(shiny)

ui<- shinyUI(fluidPage(

  titlePanel("Incremental Plots"),      
  sidebarLayout(
    sidebarPanel(),        
    mainPanel(
      tableOutput('var')
    )
  )
))

start_time <- 100000
end_time = start_time - 1000

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

  # Initialize
  reval_omega <- reactiveVal(data.frame(st = c(start_time),et = c(end_time)))
  reval_start <- reactiveVal(start_time)
  reval_end <- reactiveVal(end_time)

  # update our reactiveVal 
  observe({
    invalidateLater(1000, session) # every second
    isolate({
      reval_start(reval_end()) # set start time to current end time
      reval_end(reval_start() - 1000) # set end time to start - 1000
      omega_new <- data.frame(st = reval_start(),et = reval_end()) # create a new row for the dataframe
      reval_omega(rbind(reval_omega(),omega_new)) # rbind the reval_omega() and the new row, and store result in reval_omega()
    })
  })
  output$var <- renderTable(reval_omega())
}

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