首页 > 解决方案 > 如何使用 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

标签: rshinyleaflet

解决方案


也许像下面这样?您基本上将数据存储在反应对象中,然后侦听该反应对象。

  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
  })

推荐阅读