使用循环更新 ggplot2 折线图的数据

Update the data for ggplot2 line graph using the loop

嗨,我是编程新手,'R'。编写了以下代码来测试我的 ping 连续性:

library(pingr)
library(ggplot2)

cc=2
counts <- c(1:1)
pings <- c(ping("8.8.8.8",count = 1))

rgh <- data.frame(counts,pings)
ggplot(rgh, aes(x=counts,y=pings))+geom_line(aes(col="red"))+coord_cartesian(xlim=(c(0,300)),ylim=(c(0,100)))
#qplot(x=counts,y=pings,data=rgh)

while (cc<300) {
  counts <- c(counts,cc)
  pings <- c(pings,ping("8.8.8.8",count = 1))

  rgh <- data.frame(counts,pings)
    print(ggplot(rgh, aes(x=counts,y=pings))+geom_line(aes(col="red"))+coord_cartesian(xlim=(c(0,300)),ylim=(c(0,100))))
    cc <- cc+1

}

我想让它看起来像 speedtest.net 上的酷图。但是这个每次循环都会重新绘制整个图,这会花费太多时间。还有其他办法吗?

这里有一个例子,说明如何使用 shiny 和 plotly 设置所需的行为:

library(shiny)
library(plotly)
library(pingr) 

带有开始按钮和绘图区域的简单 ui:

ui <- fluidPage(
  div(actionButton("button", "start")),
  div(plotlyOutput("plot"), id='graph')
)

server <- function(input, output, session) {
  p <- plot_ly(
    y = ping("8.8.8.8",count = 1),
    type = 'scatter',
    mode = 'lines') 
  output$plot <- renderPlotly(p)
  observeEvent(input$button, {
    while(TRUE){
      Sys.sleep(1)
      plotlyProxy("plot", session) %>%
        plotlyProxyInvoke("extendTraces", list(y=list(list(ping("8.8.8.8",count = 1)))), list(0))
    }
  })
}

shinyApp(ui, server)

一段时间后它看起来像这样:

编辑:回答评论中的问题: 有多种方法可以控制 ping 的数量。也许是最简单的:

server <- function(input, output, session) {
  p <- plot_ly(
    y = ping("8.8.8.8",count = 1),
    type = 'scatter',
    mode = 'lines') 
  a = 1
  output$plot <- renderPlotly(p)
  observeEvent(input$button, {
    while(a <= 30){
      a <- a + 1
      Sys.sleep(1)
      plotlyProxy("plot", session) %>%
        plotlyProxyInvoke("extendTraces", list(y=list(list(ping("8.8.8.8",count = 1)))), list(0))
    }
  })
}

此处执行了 30 次 ping

要更改 ping 的频率,请将 Sys.sleep(1) 更改为您的链接。