在R中的Shiny App中动态绘制Plotly图

时间:2017-04-21 11:47:35

标签: r shiny plotly

我想在R中的Shiny App中绘制一个Plotly图。我想要这样的功能,我想在循环中绘制一定数量的点(比如说20)。

这是我的Server.R代码: -

xAxis = vector("numeric", as.numeric(input$Generations))
yAxis = vector("numeric", as.numeric(input$Generations))

graphDF = data.frame(cbind(xAxis, yAxis))

for(i in 1 : 5)
{    output$GA = renderPlotly({

  print(graphDF) # Testing 

  graphDF$yAxis[i] = i
  graphDF$xAxis[i] = i

  print(graphDF) # Testing

  # Plotly functionality
  p <- plot_ly(graphDF, x = graphDF$xAxis, y = graphDF$yAxis)

})
}

非常感谢任何帮助。

亲切的问候

1 个答案:

答案 0 :(得分:3)

这比它看起来更复杂。看起来你想要迭代并创建一系列图形图形,随着时间的推移改变数据值。

因为Generations滑块将矢量重新初始化为新的长度, 并且每次迭代都会改变正在绘制的数据的状态,您不能只是级联反应函数。将状态存储在reactiveValues中是处理此问题的好方法。

主要变化如下:

  • 添加reactiveValues以存储xAxisyAxis
  • 添加observeEvent以在值更改时重新初始化这些值
  • 添加了&#34;迭代范围&#34;滑块来驱动迭代(比反应计时器更容易)。请注意,它有一个animate参数,可能(可能)自己创建一个反应计时器。
  • 修改了剧情调用,使其更加传统,避免发出警告。

代码:

library(shiny)
library(plotly)

u <- fluidPage(
  titlePanel("Iterations of a plotly graph"),
  sidebarLayout(
    sidebarPanel(
      sliderInput("Generations","Number of Generations:",
                  min = 1,  max = 50,  value = 20),
      sliderInput("iter", "Iteration range:", 
                  value = 1,  min = 1,  max = 1000, step = 1,
                  animate=animationOptions(interval=800, loop=T)),
      p("To start click on the blue arrowhead")
    ),
    mainPanel(
      plotlyOutput("GA")
    )
))
s <- shinyServer(function(input,output){

  rv <- reactiveValues(xAxis=NULL,yAxis=NULL)

  observeEvent(input$Generations,{
    rv$xAxis=vector("numeric", as.numeric(input$Generations))
    rv$yAxis=vector("numeric", as.numeric(input$Generations))
  })
  output$GA = renderPlotly({
      rv$yAxis[input$iter] <- input$iter 
      rv$xAxis[input$iter] <- input$iter
      gdf <- data.frame(xAxis=rv$xAxis, yAxis=rv$yAxis)
      plot_ly(gdf, x = ~xAxis, y = ~yAxis, type="scatter",mode="markers")
    })
})
shinyApp(u,s)

因为它是动态的,你必须运行它才能看到它是如何工作的,但这是经过几次迭代后的屏幕截图:

enter image description here