Art*_*hur 2 events r reactive-programming shiny
我有一个连续变量(传单地图上的缩放),并且我想仅在此变量超过给定阈值(仅在给定缩放级别之后)时激活某些操作(多边形绘制)。
这是一个类似的 - 但更简单,更容易重现 - 玩具问题:
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)
Run Code Online (Sandbox Code Playgroud)
问题是,由于Shiny的反应性系统,情节(在玩具问题中)或地图(在实际问题中)不断更新,即使我希望它们仅在超过阈值时更新,在任一方向。
我试图用建筑observeEvent,eventReactive,reactiveValues,等夹杂if ... else声明。但似乎每当输入更新时,它都会触发整个事件链,无论因变量是否已更改。在玩具问题中,从到时input$slider > 200停留并不重要,它无论如何都会触发绘图。TRUEinput$slider100101
请告诉我我错了!
除了使用observeEvent(),您可以使用常规observe()并将条件用于 if 语句,并且仅return()在条件失败时使用。
就像是
observe({
if (input$slider <= 200) return()
...
})
Run Code Online (Sandbox Code Playgroud)
编辑:在评论中,您想以某种方式跟踪最后一个值。这是您如何做到这一点。
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)
Run Code Online (Sandbox Code Playgroud)