2015-05-10 29 views
6

Próbuję utworzyć interaktywną mapę w R, aby wyświetlić burze za pomocą Shiny, Leaflet i rCharts (struktura jest luźno oparta na aplikacji http://ramnathv.github.io/bikeshare).Utwórz interaktywną mapę internetową ze znacznikami w R, korzystając z Shiny, Leaflet i rCharts

Pomysł polega na tym, że użytkownik wybiera jedną nazwę burzy na raz (nazwa df $), a znaczniki dla tej burzy (szerokość/długość) są wyświetlane na mapie ulotek (z funkcją powiększania/pomniejszania).

Nie mogę otrzymać ulotki, aby załadować nową mapę i znaczniki dla każdej oddzielnej nazwy burzy. Każda pomoc/rada byłaby bardzo ceniona!

To, co dane (TCs.Rda) wyglądać (przykładowy plik danych przesłanych here):

Year Name Wind lat long 
2010 BONNIE 15  30.100 -91.000 
2010 FIVE 25  30.000 -88.900 
2010 FIVE 25  30.400 -88.800 
2010 FIVE 25  30.800 -88.600 

server.R

library(shiny); library(rCharts); library(leaflet)  
load("TCs.Rda") 
name <- sort(unique(data$Name)) 
shinyServer(function(input, output){  
    dataset <- reactive({ df <- data[data$Name == input$name, ] })  
    output$add <- renderText({paste("Storm name:", input$name)}) 
    output$Controls <- renderUI({ 
     list(selectInput("name", "Select storm", name, selected=name[1])) }) 
    output$myChart <- renderMap({ 
     df <- dataset() 
     map <- Leaflet$new() 
     map$setView(c(35, -80),zoom=5) 
     map$tileLayer(provider='Stamen.TonerLite')   
     for (i in 1:nrow(df)) { 
     map$marker(c(df[i, "lat"], df[i, "long"]), bindPopup=df[i, "Wind"])} 
     map$set(dom='myChart') 
     map$enablePopover(TRUE) 
     map$fullScreen(TRUE) 
     map  
     }) 
    }) 

ui.R

library(shiny); library(rCharts); library(leaflet) 
shinyUI(pageWithSidebar( 
    headerPanel("Storm tracks"), 
    sidebarPanel(h3("My subtitle"), uiOutput("Controls")), 
    mainPanel(      
    tabsetPanel(  
     h3(textOutput("add")),    
     tabPanel("map", tags$style(".leaflet {height: 400px;}"), # I can only get this to work with a tabset panel, but ideally both the textOutput and map would go directly in the mainPanel 
     showOutput("myChart", "leaflet"))) 
    ) 
)) 

Odpowiedz

5

W końcu sam to wymyśliłem! Kolejny wpis (Shiny renders a responsive rCharts leaflet map once, but is blank if you change the input variable) wskazał, że wiersz kodu "map $ set (dom =" myChart ")" może uniemożliwić Leafletowi ponowne załadowanie nowej mapy przy każdym wyborze.

Nie sądziłem, że to może być problem (mój przykład jest trochę inny i nie korzysta z geojsona), ale podobno było.

To jest mój kod roboczych, w przypadku, gdy ktoś inny pomaga -

server.R

library(shiny);library(rCharts);library(leaflet) 
load("TCs.Rda") 
name <- sort(unique(data$Name)) 
shinyServer(function(input, output){ 
    dataset <- reactive({df<- data[data$Name == input$name, ]})  
    output$add <- renderText({paste("Storm name:", input$name)}) 
    output$Controls <- renderUI({list(selectInput("name", "Select storm", name, selected=name[1])) }) 
output$myChart <- renderMap({ 
    df <- dataset() 
    map <- Leaflet$new() 
    map$setView(c(35, -80),zoom=3) 
    map$tileLayer(provider='Stamen.TonerLite')  
    for (i in 1:nrow(df)) {map$marker(c(df[i, "lat"], df[i, "long"]))}   
    map$fullScreen(TRUE) 
    map  
    }) 
}) 

ui.R

library(shiny); library(rCharts); library(leaflet) 
shinyUI(pageWithSidebar( 
    headerPanel("Storm tracks"), 
    sidebarPanel(h3("My subtitle"), uiOutput("Controls")), 
    mainPanel(  
     tabsetPanel(  
     tabPanel("map", h3(textOutput("add")), 
      tags$style(".leaflet {height: 400px;}"), 
      showOutput("myChart", "leaflet"))) 
) 
)) 

A wynik wygląda tak:

enter image description here