如何使用 eventReactive 读取和显示按钮点击数据?
How to read & show data on button click using eventReactive?
我需要做的是仅在单击按钮时读取和显示 geoJSON 数据。我的原始数据非常繁重,应用程序启动时无需加载它 - 仅在单击特定按钮时加载。老实说,我用 observeEvent
做到了并且它有效。我只是想知道如何用 eventReactive
做到这一点,我认为在这个地方会更好。
我的正常工作代码如下。
Coommented 代码是我尝试使用 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)
基本上,如果我想阅读和显示给定的数据集 'on demand' - 哪种方法更好: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
})
我需要做的是仅在单击按钮时读取和显示 geoJSON 数据。我的原始数据非常繁重,应用程序启动时无需加载它 - 仅在单击特定按钮时加载。老实说,我用 observeEvent
做到了并且它有效。我只是想知道如何用 eventReactive
做到这一点,我认为在这个地方会更好。
我的正常工作代码如下。
Coommented 代码是我尝试使用 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)
基本上,如果我想阅读和显示给定的数据集 'on demand' - 哪种方法更好: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
})