Search code examples
rshinyr-leaflet

Select Input for Leaflet in Shiny


I am trying to construct a map with leaflet using shiny however my code does not change the leaflet map according to the selected input. Does anyone know how to make this code below react to do the select input? I tried to do it with get function but could not succeed.

Here is my data:

> datamap
         Country.code EVENTONE EVENTTWO EVENTTHREE
1  Bosnia and Herzegovina       11        1          5
2             South Korea        1        4          4
3             Philippines        1        5          6
4               Indonesia        1        6          8
5                Thailand        1        0          9
6                Mongolia        1        0          3
7      Russian Federation        1        0          4
8                 Ukraine        1        0          8
9                Slovenia        1        0          5
10               Mongolia        1        0          0
11               Pakistan        1        0          0
12             Bangladesh        1        0          0

And here is my code:

library(shiny)
library(rworldmap) 
library(ggplot2)



shinyUI(fluidPage( 
  fluidRow(h1("Events in the World", align = "center")),
  fluidRow(
    column(2,
       
       selectInput("var", "Choose the Type Event:",
                   choices=c("Event One" = "EVENTONE", 
                             "Event Two" = "EVETNTWO", 
                             "Event Three" = "EVENTTHREE"))

),

column(10,
       
       tabsetPanel(
         tabPanel("Map View", leafletOutput("TheMap", width = "100%")
         )

       ) #end tabset panel
    )
  ) 
))

shinyServer(function(input, output) {

  datamap <- read.csv(".../Documents/R Directory/App-4/mapexcel4CSV.csv",             
                  stringsAsFactors=FALSE, header=TRUE)
  sPDF <- joinCountryData2Map(datamap, joinCode='NAME',       
                          nameJoinColumn='Country.code')
  sPDF <- sPDF[sPDF$ADMIN!='Antarctica',]

  output$TheMap <- renderLeaflet({
  mapselect <- get(input$var)
  pal <- colorBin("YlOrRd", domain = mapselect) 
  labels <- sprintf(
    "<strong>%s</strong><br/>Number of events: %g</sup>",
    sPDF$NAME, sPDF$mapselect
  ) %>% lapply(htmltools::HTML)

  TheMap<- leaflet(data = sPDF) %>% addTiles() %>% addPolygons(stroke = FALSE) %>% addPolygons(
  fillColor = ~pal(mapselect),
  weight = 2,
  opacity = 1,
  color = "white",
  dashArray = "3",
  fillOpacity = 0.7,
  highlight = highlightOptions(
    weight = 5,
    color = "#666",
    dashArray = "",
    fillOpacity = 0.7,
    bringToFront = TRUE),
  label = labels,
  labelOptions = labelOptions(
    style = list("font-weight" = "normal", padding = "3px 8px"),
    textsize = "15px",
    direction = "auto"))
  }
  )  
})
shinyApp(ui = ui, server = server)

Solution

  • I guess this is what you are aiming for:

    library(shiny)
      library(rworldmap) 
      library(ggplot2)
      library(leaflet)
    
    
    
     ui <-  shinyUI(fluidPage( 
        fluidRow(h1("Events in the World", align = "center")),
        fluidRow(
          column(2,
    
                 selectInput("var", "Choose the Type Event:",
                             choices=c("Event One" = "EVENTONE", 
                                       "Event Two" = "EVENTTWO", 
                                       "Event Three" = "EVENTTHREE"))
    
          ),
    
          column(10,
    
                 tabsetPanel(
                   tabPanel("Map View", leafletOutput("TheMap", width = "100%")
                   )
    
                 ) #end tabset panel
          )
        ) 
      ))
    
      server <- shinyServer(function(input, output) {
    
        datamap <- read.csv("E:/test.csv",             
                            stringsAsFactors=FALSE, header=TRUE)
        sPDF <- joinCountryData2Map(datamap, joinCode='NAME',       
                                    nameJoinColumn='Country.code')
        sPDF <- sPDF[sPDF$ADMIN!='Antarctica',]
        legVal <-  c(min(datamap[,-1]), max(datamap[,-1]) )
        output$TheMap <- renderLeaflet({
          mapselect <- input$var
          pal <- colorBin("YlOrRd", domain = as.numeric(sPDF[[mapselect]]))
          labels <- sprintf(
            "<strong>%s</strong><br/>Number of events: %g</sup>",
            sPDF$NAME, sPDF[[mapselect]]
          ) %>% lapply(htmltools::HTML)
    
          TheMap<- leaflet(data = sPDF) %>% addTiles() %>% addPolygons(stroke = FALSE) %>% addPolygons(
            fillColor = ~pal(as.numeric(sPDF[[mapselect]])),
            weight = 2,
            opacity = 1,
            color = "white",
            dashArray = "3",
            fillOpacity = 0.7,
            highlight = highlightOptions(
              weight = 5,
              color = "#666",
              dashArray = "",
              fillOpacity = 0.7,
              bringToFront = TRUE),
            label = labels,
            labelOptions = labelOptions(
              style = list("font-weight" = "normal", padding = "3px 8px"),
              textsize = "15px",
              direction = "auto"))%>% addLegend("bottomleft", pal = pal, value = legVal)
        }
        )  
      })
      shinyApp(ui = ui, server = server)
    

    Hope it helps!