在Shiny中使用多个reactiveVal时出现意外的反应

时间:2017-08-04 07:37:30

标签: r shiny

我在Shiny中使用多个reactiveVal时遇到意外行为。我知道反应值的存在,这可能会解决我的问题,但我仍然想知道为什么会发生这种行为。在下面的代码中,我有两个reactiveVals:

  • reval1 ,每秒更新一次
  • reval2 ,永远不会改变价值。

my_plot仅依赖于reval2。因此我希望它永远不会失效。然而,情节每秒都在变化。在documentation中,我没有看到任何提及使用两个reactiveVal的不可能性。我误解或忽略了什么吗?

server <- function(input, output, session) {

  set.seed(1)
  reval1<- reactiveVal(runif(1)) # useful
  reval2 <- reactiveVal(runif(1)) # useless

  # update reval1 every second
  autoInvalidate <- reactiveTimer(intervalMs = 1000, session = session) 
  observeEvent(autoInvalidate(),{
    reval1(reval1()+1)
  })

  # plot is only dependent on reval2.
  output$my_plot<- renderPlot({
    a<- reval2()
    df= data.frame(x=runif(10),y=runif(10))
    plot(df$x,df$y)
  })

}

ui <- shinyUI(
  fluidPage(
    plotOutput("my_plot")
  )
)

shinyApp(ui,server)

2 个答案:

答案 0 :(得分:3)

这是一个已知问题。并应修复新版本的闪亮。 dev版本中已经实现了修复。注意我自己还没有测试过......

https://github.com/rstudio/shiny/pull/1712

https://github.com/rstudio/shiny/issues/1710

答案 1 :(得分:0)

这真的很有趣,我甚至会在这种情况下提交一个错误。我试着把它重写为

server <- function(input, output, session) {

  set.seed(1)
  reval1 <- reactiveVal(runif(1)) # useful
  reval2 <- reactiveVal(runif(1)) # useless

  # update reval1 every second
  autoInvalidate <- reactiveTimer(intervalMs = 1000) 
  observe({
    autoInvalidate()
    reval1(reval1() + 1)
    print(reval1())
  })

  # plot is only dependent on reval2.
  output$my_plot<- renderPlot({
    a <- reval2()
    df <- data.frame(x=runif(10),y=runif(10))
    plot(df$x, df$y)
  })

}

把它放在一些浏览器中,在这里,情节甚至没有渲染。您还可以看到,在运行时期间,observe()output$my_plot在循环中被触发,并且持续时间比1000毫秒短得多!顺便说一下,这是反应曲线:

Reactivity plot