繁体   English   中英

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

[英]Unexpected reactivity while using multiple reactiveVal in Shiny

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

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

my_plot仅依赖于reval2。 因此我希望它永远不会失效。 然而,情节每秒都在变化。 文档中 ,我没有看到任何提及使用两个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)

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

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

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

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

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在一个循环中被触发,并且持续时间比1000ms短得多! 顺便说一下,这是反应曲线:

反应性图

暂无
暂无

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

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