R-有条件反应性光泽

  • 本文关键字:有条件 r 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)
  })
})

UI文件:

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

winston称此问题"状态"累积 - 您不仅要显示当前数据,而且要显示上一个图所产生的东西(最佳了解此信息的地方是在https://www.rstudio.com/resources/videos/coordined-multiped-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)
    })
  }
)

最新更新