条件响应式Shiny

6
在Shiny中,响应式表达式会将更改传播到需要的位置。我们可以使用isolate来抑制一些行为,但是我们能否根据自己的逻辑表达式抑制传播的更改呢?
我提供的示例是一个简单的散点图,我们用abline在用户点击处绘制十字线。不幸的是,Shiny认为结果是一个新的图,我们的点击值被重置为NULL...这反过来又被视为要传播的值的更新。图形被重新绘制,并且NULL被传递到abline的两个参数中。
我的hack(下面被注释掉了)是在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”语句似乎在这个示例中实现了您想要的功能,因此最好提供一个不起作用的示例。 - Hack-R
renderPlot有些静态,如果想要实现你想要的效果,你应该使用更高级的库,比如rCharts或者highcharter来调用这些变化。 - Pork Chop
喜欢这样吗?(http://shiny.rstudio.com/reference/shiny/latest/actionButton.html) - alistaire
@Hack-R 我认为我的修复方案导致同一图形被绘制两次这一事实相当糟糕! - Mark O'Connell
@Pork Chop 感谢您的建议。我正在以其他方式实现我的默认交互式图形... 我只是想提供一个 Shiny 的替代方案。 - Mark O'Connell
@alistaire,我不认为这个方法能解决问题,但如果你可以的话,请提供一个例子。 - Mark O'Connell
1个回答

2
温斯顿将这个问题称为“状态”积累——你不仅要显示当前数据,还要显示由之前图形生成的内容(最好的学习方式在于访问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)
    })
  }
)

谢谢!从这个意思可以理解,我们目前不能使用自己的逻辑表达式来控制失效。我假设这个解决方案依赖于observeEvent具有ignoreNULL = TRUE,并且在一般情况下,如果input$click$x为2或其他值,我们无法阻止更新。如果是这种情况,我可能只需编辑问题以更多地涉及停止循环行为。 - Mark O'Connell
你可以这样做,但会更加棘手。我认为最好还是提出一个新问题。 - hadley
@hadley 在你的回答中提供的链接已经失效。如果有更好的学习资源,请发布出来。我想学习关于状态累积的知识。 - Lazarus Thurston
@LazarusThurston 我不太记得那个链接具体是什么内容,但可能是这个 https://www.rstudio.com/resources/shiny-dev-con/brushing-ggvis/。 - Mark O'Connell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接