我需要做的是仅在单击按钮时读取并显示 geoJSON 数据。我的原始数据非常重,应用程序启动时无需加载它 - 仅当单击特定按钮时。老实说,我用
observeEvent
做到了,并且有效。我只是想知道如何用 eventReactive
做到这一点,我认为在这个地方会更好。
我的正常工作代码如下。 推荐的代码是我尝试使用
eventReactive
- 它也工作(相当)好,但是..当我运行代码时,底图不会显示,只有当我单击按钮时,它才会与等值线一起显示。
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
?
也许像下面这样? 您基本上将数据存储在反应性对象中,然后监听该反应性对象。
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
})