2016-09-07 2 views
0

Я пытаюсь создать листовку Блестящее приложение, однако я продолжаю получать ошибку Warning: Error in derivePoints: addMarkers requires non-NULL longitude/latitude values. Я приложил сюда код. Кроме того, снимок экрана из файлов входных данных и ссылок для загрузки.Блестящая брошюра R AddMarkers NULL значение eror

DataBooks.csv

enter image description here

GPSBook.csv

enter image description here

Код:

library(shiny) 
    library(leaflet) 

    Location_levels=list(Institutional=0, Provincial=1, National=2, International=3) 
    DataBook <- read.csv("~/R_Projects/TNL_Network/DataBook.csv", comment.char="#") 
    GPSBook <- read.csv("~/R_Projects/TNL_Network/GPSBook.csv", comment.char="#") 

    ## Create content for the popups in the markers 
    popUpContent <- function(ins_id){ 
     subs<-subset(DataBook, Institute_id==ins_id) 
     name <- subs$Institute[[1]] 
     return(name[[1]]) 
    } 

    ## Get unique markers based on the location type selected. This function calls the popup content function above and returns a dataframe 
    markerData <- function(location){ 
     subs1<-subset(DataBook, Location_level<=Location_levels[location]) 
     unique_ins_ids<-levels(factor(subs1$Institute_id)) 
     mdata.list <- vector("list", length(unique_ins_ids)) 
     for(i in 1:length(unique_ins_ids)){ 
     mdata.list[[i]] <- list(subset(GPSBook, Institute_id==unique_ins_ids[i])["Longitude"][[1]], subset(GPSBook, Institute_id==unique_ins_ids[i])["Latitude"][[1]], 
         as.character(popUpContent(unique_ins_ids[i]))) 
     } 
     solution <- do.call('rbind', mdata.list) 
     dataf<-data.frame(solution) 
     colnames(dataf)<-c("lat", "long", "Msg") ## I ihave mixed up the origincal longitude and latitude. I invert it here. 
     return(dataf) 
    } 

    ## Function to create initial data. 
    initData <- function(){ 
     return(markerData("International")) 
    } 
    init_dataset <- initData() 

    ui <- fluidPage(
     leafletOutput("mymap"), 
     p(), 
     radioButtons(inputId = "radio", label = "", choices = as.list(levels(DataBook$Location)), selected = "International") 
    ) 

    server <- function(input, output, session) { 
     observe({ 
     proxy <- leafletProxy("mymap", data = markerData(input$radio)) 
     proxy %>% clearMarkers() 
     proxy %>% addMarkers() 
     }) 

     output$mymap <- renderLeaflet({ 
     leaflet(data = markerData(input$radio)) %>% addTiles() %>% 
      addMarkers() 
     }) 
    } 

    shinyApp(ui, server) 

Большое спасибо за помощь. Ссылки на файлы.

https://drive.google.com/open?id=0B-TWCTRv7UM1bnVpWEIxTnB2d28

https://drive.google.com/open?id=0B-TWCTRv7UM1cjBxNnlhR2ZXc0U

+0

Можете ли вы предоставить файлы csv? Или какой-то образец из файлов для проверки кода? –

+0

Отредактирован вопрос о включении файлов данных. Спасибо за помощь. – ssm

ответ

2

Я надеюсь, что я вас понял намерение. Если да, это может быть упрощено. Вот как я это сделаю. (просто вернитесь к правильным каталогам, где находятся ваши файлы csv). Код:

library(shiny) 
    library(leaflet) 


    DataBook <- read.csv("./data/DataBook.csv", comment.char="#") 
    GPSBook <- read.csv("./data/GPSBook.csv", comment.char="#") 
    names(GPSBook) <- names(GPSBook)[c(1,2,4,3)] 

    ui <- fluidPage(
      leafletOutput("mymap"), 
      p(), 
      radioButtons(inputId = "radio", label = "", choices = as.list(levels(DataBook$Location)), selected = "International") 
    ) 

    server <- function(input, output, session) { 

      location <- reactive({ 
        tmp <- subset(DataBook, Location_level <= Location_levels[input$radio]) 
        uniqueIds <- unique(tmp$Institute_id) 
        tmpGps <- subset(GPSBook, Institute_id %in% uniqueIds) 


      }) 

      observe({ 
        proxy <- leafletProxy("mymap", data = location()) 
        proxy %>% clearMarkers() 
        proxy %>% addMarkers(popup = ~as.character(Name)) 
      }) 

      output$mymap <- renderLeaflet({ 
        leaflet(data = GPSBook) %>% addTiles() %>% 
          addMarkers(popup = ~as.character(Name)) 
      }) 
    } 

    shinyApp(ui, server) 

В исходном коде функция создавала список, так что данные не были получены, как листовка бы ожидать от них.

+0

Привет, большое спасибо за помощь. Код отлично работает. Один вопрос, как можно сбросить представление, чтобы отображать только видимые маркеры. Итак, если я выбираю провинциальный, я хочу, чтобы карта только увеличивалась. Еще раз спасибо. – ssm

+0

Попробуйте добавить это в прокси-части проспекта: proxy%>% setView (lng = mean (location() $ Longitude), lat = mean (location() $ Latitude), zoom = 4) –

+0

Большое спасибо. Я также сделал это, используя этот код. 'fitBounds (lng1 = max (location() $ Longitude), lat1 = max (location() $ Широта), lng2 = min (location() $ Longitude), lat2 = min (location() $ Широта))' – ssm