使用Shiny模拟实时数据可视化

3
我正在创建一个POC,实时更新将在我的shiny应用程序上反映出来。想法是绘制从服务器生成的数据的频率分布。由于我尚未访问服务器,因此我模拟了数据创建,并将其馈送到我的图表中。我可以在控制台上正确地看到数据,但是没有任何内容显示在我的应用程序上。我确定我遗漏了某些东西。我认为我无法查看图表的原因是数据更新速度比渲染速度更快。有什么方法可以修改它吗?
library(shiny)
library(magrittr)
library(plotly)


ui <- shinyServer(fluidPage(
  plotOutput("plot")
))


alarms = c("NodeDown","GrowthRate","DecayRate","DiskFull","ServiceDown","Planned_shutdown","etc.....etc","ServerOutage",
           "No Casue")

server <- shinyServer(function(input, output, session){
  # Function to get new observations
  get_new_data <- function(){

    new = sample(alarms,1)
#    data <- new %>% rbind %>% data.frame
    return(new)
  }

  # Initialize my_data
  my_data <<- get_new_data()

  # Function to update my_data
  update_data <- function(){
    my_data <<- c(get_new_data(), my_data)

  }

  output$plot <- renderPlotly({

    invalidateLater(1000, session)
    update_data()
#    print(my_data)
    dd = update_data()
    dd = as.data.frame(table(dd))
    print(dd)
    plot_ly(dd, x = ~dd, y = ~Freq)
  })

  # Plot the 30 most recent values
#  output$first_column <- renderPlot({
#    print("Render")
#    invalidateLater(1000, session)
#    update_data()
#    print(my_data)
#    plot(X1 ~ 1, data=my_data[1:30,], ylim=c(-3, 3), las=1, type="l")
#  })
})

shinyApp(ui=ui,server=server)
1个回答

2

您应该使用reactiveValues来追加向量,并使用reactiveTimerobserveEvent每秒触发一次。

此外,如果您想在server中使用renderPlotly,则应该在ui中使用plotlyOutput而不是plotOutput

尝试这个:

library(shiny)
library(magrittr)
library(plotly)


ui <- shinyServer(fluidPage(
  plotlyOutput("plot")
))


alarms = c("NodeDown","GrowthRate","DecayRate","DiskFull","ServiceDown","Planned_shutdown","etc.....etc","ServerOutage",
           "No Casue")

server <- shinyServer(function(input, output, session){
  get_new_data <- function(){
    new = sample(alarms,1)
    return(new)
  }

  my_data <-reactiveValues(data=get_new_data())

  observeEvent(reactiveTimer(2000)(),{ # Trigger every 2 seconds
    my_data$data<-c(get_new_data(),my_data$data)
    print(my_data$data)
  })

  output$plot <- renderPlotly({
    dd=as.data.frame(table(my_data$data))
    print(dd)
    plot_ly(dd, x = ~Var1, y = ~Freq)
  })

})

shinyApp(ui=ui,server=server)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接