2016-06-14 22 views
5

Ich versuche ein Flexdashboard zu erstellen, das ein Event (map_marker_click) in Leaflet verwendet, um ein Highcharts-Säulendiagramm in einem anderen Diagramm auf derselben Seite anzuzeigen. Ich habe andere Beispiele genommen und finde in den Flexdashboards-Tutorials oder Beispielen nicht ganz das, wonach ich suche. This ist sehr nah an dem, was ich will, ohne die glänzenden Eingänge oder plot.ly Integration und die Verwendung von Markern anstelle von Polygonen (viel weniger los).Flexdashboards und Leaflet und Marker klicken mit Highcharts

Ich habe den folgenden Code für eine 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()) 
}) 
``` 

Ich frage mich, ob dies mit oder ohne glänzende Integration in einem flexdashboard erreicht werden könnte.

Antwort

11

Der folgende Code wird es tun. Kurz gesagt, sind die wichtigsten Schritte:

  1. Wenn die Karte zu initialisieren, müssen Sie eine Spalte als layerId angeben. Auf diese Weise weiß Leaflet, welche Werte zurückgegeben werden sollen, wenn Sie ein Ereignis angeben.
  2. Erstellen Sie eine eventReactive, die den Wert layerId zurückgibt. Sie können dies verwenden, um Ihre Daten nach Bedarf zu unterteilen, um sie an das Diagramm zu übergeben.
  3. Ich möchte einen reaktiven Datenrahmen erstellen, der die Teilmenge des Stammdatenrahmens basierend auf dem geklickt layerId ist. Du könntest die App schreiben, ohne das zu tun, aber ich teile meine Shiny-Apps so oft wie möglich in Komponenten auf.
  4. Sie können nun diese reaktiven Datenrahmen verwenden - und ihre Werte - in Ihren Anruf renderHighchart

hoffe, das hilft!

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

danke für die antwort und die klarheit. – Lebeauski