我有一个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
却没有。