【问题标题】:How to prevent shiny plot from being redrawn multiple times per UI interaction?如何防止每次 UI 交互多次重绘闪亮的情节?
【发布时间】:2017-08-08 14:27:40
【问题描述】:

在我闪亮的应用程序中,我有一个日期范围输入和一组复选框。复选框选项是根据输入 $dateRange 确定的。我遇到了一个问题,每次更改日期范围时,都会重新绘制两次绘图。第一次重绘时,它将使用新的日期范围,但使用旧的复选框选项。然后复选框选项被更新,情节被重新绘制第二次。

有什么方法可以防止多次重绘绘图,并且只有在所有其他 UI 元素都更新后才绘制它?

server.R 代码 sn-p

  # Check boxes for variants in run
  output$choose_variants <- renderUI({
    # Get the variants associated with the run
    dat <- loadVariants(input$dateRange[1], input$dateRange[2])
    if(is.null(dat))
      return()

    # Create the checkboxes and select them all by default
    checkboxGroupInput("variants", "Variants",
                        choices  = dat$variant,
                        selected = dat$variant)
  })

  # Output the data
  output$plot1 <- renderPlot({
    runLocations <- loadRunsBetweenDates(input$dateRange[1], input$dateRange[2], input$variants)
    #ggplot()
  })

ui.R代码sn-p

  sidebarPanel(
    dateRangeInput('dateRange',
      label = 'Date range',
      start = Sys.Date(), end = Sys.Date()
    ),
    uiOutput("choose_variants")
  ),

【问题讨论】:

  • 弗洛里安比我快 :( isolate() 是要走的路!

标签: r ggplot2 shiny


【解决方案1】:

由于input$variants 总是随着日期范围滑块的变化而变化,因此您可以使绘图仅依赖于input$variants

  # Output the data
  output$plot1 <- renderPlot({

    # outside of isolate statement, so this plot becomes dependent on its value.
    input$variants

    # put this in an isolate block, so it doesn´t trigger an invalidation.
    isolate(runLocations <- loadRunsBetweenDates(input$dateRange[1], input$dateRange[2], input$variants))
    #ggplot()
  })

希望这会有所帮助!

编辑:替代方案,基于评论中的条件

您可以创建一个响应式,并使您的情节仅依赖于它,如下所示:

  loadedVariants <- reactive({
  loadVariants(input$dateRange[1], input$dateRange[2])
  })

 # Output the data
  output$plot1 <- renderPlot({

    # outside of isolate statement, so this plot becomes dependent on its value.
    loadedVariants()

    # put this in an isolate block, so it doesn´t trigger an invalidation.
    isolate(runLocations <- loadRunsBetweenDates(input$dateRange[1], input$dateRange[2], input$variants))
    #ggplot()
  })

【讨论】:

  • 感谢您将我指向isolate()。唯一的问题是input$variants 可能不会在日期范围更改时始终更改。 loadVariants 可能会返回与之前选择的日期范围完全相同的值。在这种情况下,我仍然希望重新绘制情节。
  • 我添加了一个替代解决方案,但我无法对其进行测试。让我知道这是否更适合您想要的行为。
猜你喜欢
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 2014-11-29
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
相关资源
最近更新 更多