如何使用 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' - 哪种方法更好:eventReactiveobserveEvent?

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

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