繁体   English   中英

有条件的反应性有光泽

[英]Conditional reactivity Shiny

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

我给出的示例是一个简单的散点图,我们在用户单击的位置绘制了一个带abline的十字准线。 不幸的是,Shiny认为结果是一个新图,并且我们的点击值被重置为NULL ...,这又被视作对要传播的值的更新。 重绘该图,并将NULL传递给abline两个参数。

我的技巧(在下面进行注释)是在renderPlot调用中放置一个条件,该条件仅在click值为non- 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")
  )
)

温斯顿称此问题为“状态”累积-您不仅要显示当前数据,而且还希望显示以前的绘图生成的内容(了解此问题的最佳位置是https://www.rstudio.com/resources/videos/协同多视图链接画笔/

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

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)
    })
  }
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM