首页 文章

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

提问于
浏览
2

我想在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 回答

  • 3

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

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

    主要变化如下:

    • 添加 reactiveValues 以存储 xAxisyAxis

    • 添加 observeEvent 以在值更改时重新初始化这些值

    • 添加了一个"Iteration range"滑块来驱动迭代(比反应计时器更容易) . 请注意,它有一个 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

相关问题