我在Shiny中使用多个reactiveVal时遇到意外行为。我知道反应值的存在,这可能会解决我的问题,但我仍然想知道为什么会发生这种行为。在下面的代码中,我有两个reactiveVals:
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)
答案 0 :(得分:3)
这是一个已知问题。并应修复新版本的闪亮。 dev版本中已经实现了修复。注意我自己还没有测试过......
答案 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毫秒短得多!顺便说一下,这是反应曲线: