我需要做的是只在单击按钮时读取和显示geoJSON数据。我的原始数据非常重,不需要在应用程序启动时加载它-只有在单击特定按钮时才需要加载。老实说,我用observeEvent做了这件事,它起作用了。我只是想知道如何使用eventReactive来做这件事,我认为在这个地方会更好。
下面是我正常工作的代码。Coommented代码是我尝试使用eventReactive的一种尝试--它也可以很好地工作,但是..当我运行代码时,底图不会显示,只有当我单击按钮时,它才会与choropleth一起显示。
library(shiny)
library(leaflet)
library(dplyr)
library(sf)
ui <- fluidPage(
actionButton("btn", label = "Choropleths"),
leaflet::leafletOutput("map")
)
server <- function(input, output, session) {
observeEvent(input$btn, {
dataChoro <- sf::st_read(dsn = "https://raw.githubusercontent.com/PublicaMundi/MappingAPI/master/data/geojson/us-states.json")
leaflet::leafletProxy("map") %>%
leaflet::addPolygons(
data = dataChoro,
group = "raw"
)
})
# dataChoro <- eventReactive(input$btn, {
# sf::st_read(dsn = "https://raw.githubusercontent.com/PublicaMundi/MappingAPI/master/data/geojson/us-states.json")
# })
output$map <- leaflet::renderLeaflet({
leaflet::leaflet() %>%
leaflet::addTiles() %>%
leaflet::setView(-99.659006, 40.011318, zoom = 4) #%>%
# leaflet::addPolygons(
# data = dataChoro(),
# group = "raw"
# )
})
}
shinyApp(ui, server)基本上,如果我想“按需”读取和显示给定的数据集,哪种方法更好:eventReactive或observeEvent
发布于 2021-03-29 20:54:24
也许是像下面这样的东西?您基本上将数据存储在反应式对象中,然后侦听该反应式对象。
dataChoro <- eventReactive(input$btn, {
sf::st_read(dsn = "https://raw.githubusercontent.com/PublicaMundi/MappingAPI/master/data/geojson/us-states.json")
})
observeEvent(dataChoro(), {
leaflet::leafletProxy("map") %>%
leaflet::addPolygons(
data = dataChoro(),
group = "raw"
)
})
output$map <- leaflet::renderLeaflet({
leaflet::leaflet() %>%
leaflet::addTiles() %>%
leaflet::setView(-99.659006, 40.011318, zoom = 4)
})需要注意的是,请记住,每次单击该按钮时都会下载数据。您可能希望在eventReactive()标志中设置一个标志来防止出现这种情况。
下面这样的代码将会起作用
data_downloaded = FALSE
dataChoro <- eventReactive(input$btn, {
if (data_downloaded) {
req(FALSE)
}
data = sf::st_read(dsn = "https://raw.githubusercontent.com/PublicaMundi/MappingAPI/master/data/geojson/us-states.json")
data_downloaded <<- TRUE
data
})https://stackoverflow.com/questions/66814988
复制相似问题