Flexdashboards и Leaflet и щелчок маркера с Highcharts

Я пытаюсь создать flexdashboard, который использует событие (map_marker_click) в Leaflet для отображения столбчатой ​​диаграммы highcharts на другой диаграмме на той же странице. Я взял из других примеров и не могу найти то, что ищу, в руководствах или примерах Flexdashboards. Это очень близко к тому, что я хочу, без блестящих вводов или интеграции с plot.ly и использования маркеры вместо полигонов (гораздо меньше).

У меня есть следующий код для гибкой панели инструментов в R:

title: "Flexdashboards and Leaflet"
output: 
flexdashboard::flex_dashboard:
vertical_layout: fill
runtime: shiny
---

```{r,include=FALSE}
library(flexdashboard)
library(shiny)
library(leaflet)
library(highcharter)
```

```{r,include=FALSE}
latitude<-c(35.94077, 35.83770, 35.84545, 35.81584, 35.79387, 36.05600)
longitude<-c(-78.58010, -78.78084, -78.72444, -78.62568, -78.64262,-78.67600)
amounts1<-c(27, 44, 34, 46, 25, 15)
amounts2<-c(34, 52, 35, 78, 14, 24)
ids<-c("a", "b", "c", "d", "e", "f")
df<-data.frame(ids,amounts1,amounts2,latitude,longitude)
renderLeaflet({ 
leaflet() %>%
addTiles() %>%
addMarkers(lng=c(longitude),lat=c(latitude))
}) 

observeEvent(input$map_marker_click,{
      click<-input$map_marker_click
      if(is.null(click))
        return()
}) 
```

```{r}
renderHighchart({
highchart() %>%
hc_chart(type = 'column')%>%
hc_add_series(name=amounts1, data=click())
hc_add_series(name=amounts2, data=click())
})
```

Мне интересно, можно ли это сделать на гибкой панели инструментов с блестящей интеграцией или без нее.


person Lebeauski    schedule 14.06.2016    source источник


Ответы (1)


Следующий код выполнит это. Вкратце, ключевые шаги:

  1. При инициализации карты обязательно укажите столбец как layerId. Таким образом, Leaflet будет знать, какие значения возвращать при указании события.
  2. Создайте eventReactive, который возвращает значение этого layerId. Затем вы можете использовать это для подмножества данных по мере необходимости для передачи на диаграмму.
  3. Мне нравится создавать реактивный фрейм данных, который является подмножеством фрейма основных данных на основе нажатого layerId. Вы можете написать приложение, не делая этого, но мне нравится разделять мои приложения Shiny на компоненты, насколько это возможно.
  4. Теперь вы можете использовать этот реактивный фрейм данных - и его значения - в своем вызове renderHighchart

Надеюсь это поможет!

---
title: "Flex Dashboard"
output: 
  flexdashboard::flex_dashboard:
    orientation: columns
    vertical_layout: fill
runtime: shiny
---

```{r setup, include=FALSE}
library(flexdashboard)
library(shiny)
library(leaflet)
library(highcharter)

latitude<-c(35.94077, 35.83770, 35.84545, 35.81584, 35.79387, 36.05600)
longitude<-c(-78.58010, -78.78084, -78.72444, -78.62568, -78.64262,-78.67600)
amounts1<-c(27, 44, 34, 46, 25, 15)
amounts2<-c(34, 52, 35, 78, 14, 24)
ids<-c("a", "b", "c", "d", "e", "f")
df<-data.frame(ids,amounts1,amounts2,latitude,longitude)
```

Column {data-width=650}
-----------------------------------------------------------------------

```{r}
output$map <- renderLeaflet({

  leaflet() %>%
    addTiles() %>%
    addMarkers(data = df, lng = longitude, lat = latitude, 
               layerId = ~ids)

})

leafletOutput('map')  

```

Column {data-width=350}
-----------------------------------------------------------------------

```{r}

click_marker <- eventReactive(input$map_marker_click, {

  x <- input$map_marker_click

  return(x$id)

})

data_for_chart <- reactive({

  return(df[df$ids == click_marker(), ])

})

output$chart <- renderHighchart({

  highchart() %>%
    hc_chart(type = 'column') %>%
    hc_add_series(data = c(data_for_chart()$amounts1, 
                           data_for_chart()$amounts2))

})

highchartOutput('chart')

```
person kwalkertcu    schedule 24.06.2016