Flexdashboards和Leaflet以及标记点击Highcharts

时间:2016-06-14 19:43:54

标签: r highcharts shiny leaflet flexdashboard

我正在尝试创建一个flexdashboard,它使用Leaflet中的事件(map_marker_click)在同一页面上的另一个图表中显示一个highcharts柱形图。我从其他示例中获取并且在Flexdashboards教程或示例中找不到我想要的内容。 This非常接近我想要的,没有闪亮的输入或plot.ly集成和使用标记而不是多边形(更不用说继续)。

我在R中的flexdashboard有以下代码:

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

我想知道这是否可以在有或没有闪亮集成的flexdashboard中完成。

1 个答案:

答案 0 :(得分:12)

以下代码将完成它。简而言之,关键步骤是:

  1. 初始化地图时,请务必将列指定为layerId。这样,Leaflet将在您指定事件时知道要返回的值。
  2. 创建一个eventReactive,返回layerId的值。然后,您可以根据需要使用它来对数据进行子集化以传递到图表。
  3. 我喜欢根据点击的layerId创建一个反应数据帧,它是主数据帧的子集。您可以在不执行此操作的情况下编写应用程序,但我希望尽可能多地将我的Shiny应用程序分离到组件中。
  4. 您现在可以在调用renderHighchart
  5. 时使用此反应式数据框及其值

    希望这有帮助!

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