[英]Trigger an event in shiny when a variable exceeds a threshold
我有一个连续变量(在传单地图上缩放),并且仅当此变量超过给定阈值时(仅在给定缩放级别之后),我才想激活某些动作(多边形绘图)。
这是一个类似的-但更容易复制的玩具问题:
ui <- bootstrapPage(
sliderInput("slider", label='a number', min=100, max=400, value = 150),
plotOutput("plot")
)
server <- function(input, output, session) {
observeEvent(input$slider > 200, {
output$plot <- renderPlot(plot(rnorm(10000), rnorm(10000)))
})
}
shinyApp(ui, server)
问题是,由于Shiny
的反应系统,即使我希望仅在超过阈值时才更新图(在玩具问题中)或地图(在实际问题中),该图仍在不断更新,在任一方向上。
我试图用建筑observeEvent
, eventReactive
, reactiveValues
等混合if ... else
声明。 但是似乎无论何时更新输入,它都会触发整个事件链,无论因变量是否已更改。 在玩具问题中,当input$slider
从100
变为101
时, input$slider > 200
保持TRUE
无关紧要,无论如何都会触发绘图。
请告诉我我错了!
除了使用observeEvent()
,还可以使用常规的observe()
并将条件用于if语句,如果条件失败,则只需return()
。
就像是
observe({
if (input$slider <= 200) return()
...
})
编辑:在注释中,您想以某种方式跟踪最后一个值。 这是您可以执行的操作。
library(shiny)
ui <- fluidPage(
sliderInput("slider", "Slider", 1, 500, 100)
)
server <- function(input, output, session) {
values <- reactiveValues(last = 0)
observe({
if (input$slider <= 200 & values$last > 200) {
cat("check!")
}
values$last <- input$slider
})
}
shinyApp(ui = ui, server = server)
因此,通过@daattali和我们讨论的启发,一个可能的解决方案是使用reactiveValue
滑块的最后的值保存,以便当阈值在任一方向传递测试。 测试本身在observe
功能内进行:
ui <- bootstrapPage(
sliderInput("slider", label='a number', min=100, max=400, value = 150),
plotOutput("plot")
)
server <- function(input, output, session) {
output$plot <- renderPlot(plot(rnorm(10000), rnorm(10000)))
last <- reactiveValues(value = 0)
observe({
if ((input$slider <= 200 & last$value > 200)|(input$slider > 200 & last$value <= 200)) {
output$plot <- renderPlot(plot(rnorm(10000), rnorm(10000)))
}
last$value <- input$slider
})
}
shinyApp(ui, server)
使用此解决方案,仅当在两个方向上均超过阈值(滑块上的200)时,我才正确进行更新。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.