2016-06-14 58 views
5

Sto tentando di creare un flexdashboard che utilizza un evento (map_marker_click) in Leaflet per mostrare un grafico a colonne in un altro grafico sulla stessa pagina. Ho preso da altri esempi e non riesco a trovare esattamente quello che sto cercando nell'esercitazione o negli esempi di Flexdashboards. This è molto vicino a quello che voglio senza gli input lucidi o l'integrazione plot.ly e l'utilizzo di marcatori invece di poligoni (molto meno in corso).Flexdashboards e volantino e clic con Highcharts

ho il seguente codice per un flexdashboard in 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()) 
}) 
``` 

Mi chiedo se questo potrebbe essere realizzato in un flexdashboard con o senza integrazione lucido.

risposta

11

Il seguente codice verrà eseguito. In sintesi, i passaggi chiave sono:

  1. Quando si inizializza la mappa, assicurarsi di specificare una colonna come il suo layerId. In questo modo, Leaflet saprà quali valori restituire quando specifichi un evento.
  2. Creare un eventReactive che restituisce il valore di quello layerId. È quindi possibile utilizzarlo per suddividere i dati in base alle necessità per passare al grafico.
  3. Mi piace creare un frame di dati reattivo che è il sottoinsieme del frame di dati master basato sul fatto clic su layerId. Potresti scrivere l'app senza farlo, ma mi piace separare le mie app brillanti in componenti il ​​più possibile.
  4. È ora possibile utilizzare questo frame di dati reattiva - ei suoi valori - nella chiamata a renderHighchart

Spero che questo aiuti!

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

``` 
+1

grazie per la risposta e la chiarezza. – Lebeauski