当变量超过阈值时触发闪亮的事件

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的反应性系统,情节(在玩具问题中)或地图(在实际问题中)不断更新,即使我希望它们仅在超过阈值更新,在任一方向。

我试图用建筑observeEventeventReactivereactiveValues,等夹杂if ... else声明。但似乎每当输入更新时,它都会触发整个事件链,无论因变量是否已更改。在玩具问题中,从到时input$slider > 200停留并不重要,它无论如何都会触发绘图。TRUEinput$slider100101

请告诉我我错了!

Dea*_*ali 6

除了使用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)