【问题标题】:Shiny reactivity -change plot data row dynamically闪亮的反应性 - 动态更改绘图数据行
【发布时间】:2018-03-14 13:13:04
【问题描述】:

我知道 renderPlot 生成的绘图可以显示在 Shiny plotOutput 函数上。我也知道 autoinvalidate() 有助于被动地计算数据。

我正在使用以下代码显示雷达图(实际上可以是任何图表):

output$plot2 <- renderPlot({
      autoInvalidate()
        p2<<-ggradar(mtcars_radar[i,])
    })

我不知道如何在每次 autoinvalidate() 事件期间将 i 的值从 1 更改为 300。 或者无论如何我可以更改绘图中的数据行,以便绘图每秒钟使用新的数据行动态动画。 谁能帮帮我?

完整代码在这里:

library(shiny)
library(ggplot2)
 mtcars %>%
 rownames_to_column( var = "group" ) %>%
 mutate_at(vars(-group),funs(rescale)) %>%
 tail(4) %>% select(1:10) -> mtcars_radar

ui <- fluidPage(
  sidebarPanel(

    actionButton("button", "Go!")
  ),
  # Show the plot
  mainPanel(
    plotOutput("plot2")
  )
)

server <- function(input, output) {
  library(ggplot2)
  library(ggradar)
  suppressPackageStartupMessages(library(dplyr))
  library(scales)

  autoInvalidate <- reactiveTimer(2000)
  plot2 <- NULL


  output$plot2 <- renderPlot({
    ggradar(mtcars_radar[1,])
  })
  observeEvent(input$button,{

     output$plot2 <- renderPlot({
      autoInvalidate()
        p2<<-ggradar(mtcars_radar[i,])
        p2
    })
  })

}

# Run the application 
shinyApp(ui = ui, server = server)

有什么帮助吗?

【问题讨论】:

    标签: r shiny reactive-programming


    【解决方案1】:

    这是您需要存储行索引并每秒更改的反应值的地方。我没有库ggradar,所以我将只打印出当前行索引值。正如Shiny documentation 所建议的那样,我还使用了invalidateLater 而不是reactiveTimer

    library(shiny)
    
    ui <- fluidPage(
      verbatimTextOutput("debug")
    )
    
    server <- function(input, output) {
    
      row_idx_max <- 15
      row_idx <- reactiveVal(0)
    
      observe({
        isolate(row_idx(row_idx() + 1))
        cur_row_idx <- isolate(row_idx())
        if (cur_row_idx < row_idx_max) {
          invalidateLater(1000)
        }
      })
    
      output$debug <- renderPrint({
        row_idx()
      })
    }
    
    shinyApp(ui, server)
    

    【讨论】:

    • 在其他地方有一些使用动画滑块输入的建议。但这种方法很慢。你的建议太棒了。谢谢你救了我。
    • 只是一个额外的问题,如何在一定次数的迭代后停止失效?
    • @doctshinds 我更新了代码以添加条件测试。 invalidateLater 什么也不做,只是制定了一个“稍后运行这个反应块”的计划,知道它做了什么可以帮助你更好地理解它为什么有效。您需要注意的一件事是,如果您使用 row_idx() 对数据进行子集化,请检查它是否大于 0,因为我相信在它立即增加到 1 之前它是 0 的时间很短。
    • 非常感谢。很好的方法,非常感谢您分享您的知识
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 2013-12-22
    • 2015-11-17
    • 1970-01-01
    • 2017-03-07
    • 2015-06-23
    相关资源
    最近更新 更多