r - 如何使用 eventReactive 在按钮单击时读取和显示数据?
问题描述
我需要做的是仅在单击按钮时读取和显示 geoJSON 数据。我的原始数据非常重,应用程序启动时无需加载它 - 仅在单击特定按钮时。老实说,我做到了,observeEvent
而且效果很好。我只是想知道如何做到这一点eventReactive
,我认为在这个地方会更好。
我的正常工作代码如下。注释代码是我尝试使用的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
?
解决方案
也许像下面这样?您基本上将数据存储在反应对象中,然后侦听该反应对象。
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
})