【问题标题】:Conditional reactivity Shiny条件反应性
【发布时间】:2016-10-20 20:20:36
【问题描述】:

Shiny 中的反应式表达式将更改传播到需要去的地方。我们可以使用isolate 抑制这种行为,但是我们可以抑制基于我们自己的逻辑表达式传播的更改吗?

我给出的例子是一个简单的散点图,我们用abline在用户点击的地方画了一个十字准线。不幸的是,Shiny 认为结果是一个新的情节,我们的点击值被重置为NULL... 这又被视为对要像往常一样传播的值的更新。情节被重绘,NULL 被传递给abline 的两个参数。

我的技巧(在下面注释掉)是在renderPlot 调用中放置一个条件,该条件仅在点击值不是NULL 时更新绘图坐标的一些非反应变量。这适用于琐碎的情节,但实际上会导致情节被绘制两次。

有什么更好的方法来做到这一点?有没有正确的方式?

服务器文件:

library(shiny)

shinyServer(function (input, output)
{
  xclick <- yclick <- NULL
  output$plot <- renderPlot({
    #if (!is.null(input$click$x)){
      xclick <<- input$click$x
      yclick <<- input$click$y
    #}
    plot(1, 1)
    abline(v = xclick, h = yclick)
  })
})

用户界面文件:

library(shiny)

shinyUI(
  basicPage(
    plotOutput("plot", click = "click", height = "400px", width = "400px")
  )
)

【问题讨论】:

  • 由于您的 if 语句似乎可以在此示例中执行您想要的操作,因此最好提供一个示例说明它何时不起作用
  • renderPlot 有点静态,要做你想做的事,你应该使用更高级的库,如 rChartshighcharter 只调用这些更改
  • 喜欢this?
  • @Hack-R 我认为我的修复导致绘制同一件事两次的事实非常糟糕!
  • @Pork Chop 感谢您的建议。我正在以其他方式实现我的默认交互式图形......我只是想提供一个闪亮的替代方案。

标签: r shiny


【解决方案1】:

Winston 将此问题称为“状态”累积 - 您不仅希望显示当前数据,还希望显示之前绘图生成的内容(了解此问题的最佳地点是 https://www.rstudio.com/resources/videos/coordinated-multiple-views-linked-brushing/

基本思想是创建您自己的一组反应值,并在用户单击绘图时更新它们。它们在下次点击之前不会失效,因此您不会得到循环行为。

library(shiny)

shinyApp(
  shinyUI(basicPage(plotOutput("plot", click = "click"))),
  function(input, output) {
    click <- reactiveValues(x = NULL, y = NULL)
    observeEvent(input$click, {
      click$x <- input$click$x
      click$y <- input$click$y
    })

    output$plot <- renderPlot({
      plot(1, 1)
      abline(v = click$x, h = click$y)
    })
  }
)

【讨论】:

  • 谢谢!我可以从中得出我们目前无法用我们自己的逻辑表达式来控制失效吗?我假设这个解决方案依赖于具有ignoreNULL = TRUE 的observeEvent,并且在一般情况下,如果input$click$x 为2 或其他值,我们无法抑制更新。如果是这种情况,我可能会编辑问题以更多地参考停止循环行为。
  • 你可以,但会比较棘手。我认为问一个新问题可能会更好
  • @hadley 在您的回答中提供的链接不再有效。如果有更好的地方可以学习这个,请发布。我想了解状态积累。
  • @LazarusThurston 我不记得那个链接的具体内容了,但可能是这个rstudio.com/resources/shiny-dev-con/brushing-ggvis
猜你喜欢
  • 2019-08-04
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 2022-01-17
  • 2019-03-25
  • 2021-05-01
  • 2022-01-12
相关资源
最近更新 更多