Нажмите на точки на карте Leaflet, чтобы создать ggplot в Shiny - PullRequest
0 голосов
/ 05 мая 2018

Используя Shiny в R, я пытаюсь создать карту Leaflet, которая позволяет пользователю нажимать на любые маркеры, чтобы создать соответствующий график, который представляет информацию (температуру) на этом конкретном сайте.

Я включил коды этого вопроса ( Нажмите на точки на листовой карте в качестве входных данных для сюжета в блестящем ) и второй трюк в этом блоге (https://www.r -bloggers.com / 4 хитрости для работы с r-листком-и-блестящим / ), но все еще не может успешно зарегистрировать нажатую точку маркера в Shiny.

т.е. Когда я нажимаю на любой сайт, ничего не появляется.

Я не смог найти никаких решений, основанных на дальнейших исследованиях, любая помощь приветствуется.

library(leaflet)
library(shiny)
library(ggplot2)

# example data frame 
wxstn_df <- data.frame(Site = c("a", "a", "b"), Latitude = c(44.1, 44.1, 37), Longitude = c(-110.2, -110.2, -112.7), Month = c(1,2,1), Temp_avg = c(10, 18, 12))

ui <- fluidPage(column(7, leafletOutput("wsmap", height = "600px")),
  column(5, plotOutput("plot", height = "600px"))
)

server <- function(input, output) {

  # create a reactive value to store the clicked site
  stn <- reactiveValues(clickedMarker = NULL)

  ## leaflet map
  output$wsmap <- renderLeaflet({
    leaflet() %>% 
      addTiles() %>% 
      addCircleMarkers(data = wxstn_df, ~unique(Longitude), ~unique(Latitude), layerId = ~unique(Site), popup = ~unique(Site)) 
  })

 # store the click
  observeEvent(input$map_marker_click, {
    stn$clickedMarker <- input$map_marker_click
  })

output$plot <- renderPlot({
      ggplot(wxstn_df[wxstn_df$Site %in% stn$clickedmarker$Site,], aes(Month, Temp_avg)) +
        geom_line()
  }) 
}

shinyApp(ui, server)

1 Ответ

0 голосов
/ 05 мая 2018

Вот решение:

library(leaflet)
library(shiny)
library(ggplot2)

# example data frame 
wxstn_df <- data.frame(Site = c("a", "a", "b"), Latitude = c(44.1, 44.1, 37), Longitude = c(-110.2, -110.2, -112.7), Month = c(1,2,1), Temp_avg = c(10, 18, 12))

ui <- fluidPage(column(7, leafletOutput("wsmap", height = "600px")),
                column(5, plotOutput("plot", height = "600px"))
)

server <- function(input, output) {

  ## leaflet map
  output$wsmap <- renderLeaflet({
    leaflet() %>% 
      addTiles() %>% 
      addCircleMarkers(data = wxstn_df, ~unique(Longitude), ~unique(Latitude), layerId = ~unique(Site), popup = ~unique(Site)) 
  })

  # generate data in reactive
  ggplot_data <- reactive({
    site <- input$wsmap_marker_click$id
    wxstn_df[wxstn_df$Site %in% site,]
  })

  output$plot <- renderPlot({
    ggplot(data = ggplot_data(), aes(Month, Temp_avg)) +
      geom_line()
  }) 
}

shinyApp(ui, server)

Основная проблема заключается в том, что вы не меняли имена объектов из примера, который вы использовали, например введите $ wsmap_marker_click, потому что wsmap - это имя вашего идентификатора листовки. Аналогично, для доступа к информации о сайте используйте вход $ wsmap_marker_click $ id, а не вход $ $ wsmap_marker_click. Часто полезно напечатать объекты внутри реактивной функции, чтобы изучить, как выглядит входной объект и как получить к нему доступ.

например.

   # generate data in reactive
  ggplot_data <- reactive({
    print(input$wsmap_marker_click)
    site <- input$wsmap_marker_click$id
    print(site)

    data <- wxstn_df[wxstn_df$Site %in% site,]
    print(data)
    data})

Лично в этой ситуации я бы предпочел использовать реактивное выражение для генерации данных ggplot (ggplot_data ()) из щелчка маркером, а не для создания объекта реактивного значения. Каждый раз, когда нажимается маркер, график обновляется новым ggplot_data ().

И доказательство того, что это работает:

enter image description here

...