在Shiny Leaflet应用程序中的observe函数内使用reactiveValues()会导致无限递归

时间:2016-12-14 18:54:56

标签: r recursion shiny leaflet infinite

我有一个Shiny Leaflet应用程序,我正在使用reactiveValues()保存地图点击事件(该问题由我here发布)。当我在地图上为每个点击事件使用observeEvent时,reactiveValues工作正常。

在我的完整应用代码中,有必要使用observe代替observeEvent。当我从observeEvent更改为observe时,reactiveValues似乎会导致无限递归。这是一些可重现的示例代码:

library(raster)
library(shiny)
library(leaflet)

#load shapefile
rwa <- getData("GADM", country = "RWA", level = 1)

shinyApp(
  ui = fluidPage(
    leafletOutput("map")
  ), 

  server <- function(input, output, session){

    #create empty vector to hold all click ids
    clickedIds <- reactiveValues(ids = vector())

    #initial map output
    output$map <- renderLeaflet({
      leaflet() %>% 
        addTiles() %>% 
        addPolygons(data = rwa, 
                    fillColor = "white", 
                    fillOpacity = 1, 
                    color = "black", 
                    stroke = T, 
                    weight = 1, 
                    layerId = rwa@data$OBJECTID, 
                    group = "regions")
    }) #END RENDER LEAFLET

    observe({

      #create object for clicked polygon
      click <- input$map_shape_click

      #append all click ids in empty vector
      clickedIds$ids <- c(clickedIds$ids, click$id)

      print(clickedIds$ids)
    }) #END OBSERVE EVENT
  }) #END SHINYAPP

我可以在以下代码行中使用unique()isolate()来停止此操作:

  #append all click ids in empty vector
  clickedIds$ids <- c(unique(clickedIds$ids), click$id)

但在我的完整应用程序中,这(无论出于何种原因)会减慢整个应用程序的速度并使一些可视化变得笨拙。我正在寻找一些替代方案,理想情况下解释为什么observe会导致无限递归,而observeEvent却没有。

0 个答案:

没有答案