rshinyr-leafletchoropleth

R shiny choropleth map


I am creating shiny app. R can read my dataset. with the comand myData <- read.csv("myData.csv"). however shinyServer file cannot read my data. and list no observation. Could you guys help me what is the problem? The Shinyapp provides interactive visulization for production of raw material in the world since 1900 to 2010 for every 10 years. Also I keep getting this error: "ERROR: 'breaks' are not unique"

The Code is here:

shinyUI(fluidPage(
 
  checkboxInput("type", "Please Select production type:",
                     c("Aluminium", "Gold", 
                       "Iron", "Silver", "Zinc")
  ),
  sliderInput("year","Choose a Year", 
              min = 1910,
              max = 2010,
              value= 2010),
  checkboxInput("Economy", "Please Select Economy Factor:", 
                     c("Income Inequallity", "labourers Real Wage", "GDP", "Inflation")),

  plotOutput("thisPlot"),
  leafletOutput("myMap")
)
)

shinyServer:

myData <- read.csv("myData.csv")
shinyServer<- function(input,output){
  
  output$myMap <- renderLeaflet({
    temp <- which(myData$type == input$type &
                    myData$year == input$year)
    myData <- myData[temp,]
        
    pal <- colorQuantile("YlGn", myData$production, n = 9)
    country_popup <- paste0("<strong>Estado: </strong>", myData$Country)
    
  leaflet(data = myData) %>% 
      setView(46.227638, 2.213749, zoom = 2) %>% 
      addTiles() %>% 
     addPolygons( lng = ~myData$Long, lat = ~myData$Lat, 
                 fillColor = ~pal(myData$production), 
                     fillOpacity = 0.8, 
                     color = "#BDBDC3", 
                     weight = 1, 
                     popup = country_popup)
   
   
  })
}

the data is:

Names = c("id", 
"Country", "type", "year", "production", "GDP", "Income", "Inflation", 
"Laborer", "Lat", "Long"), class = "data.frame", row.names = c(NA, 
-10670L))
head(myData)
  id Country type year production GDP   Income Inflation   Laborer      Lat  
Long

 1  1  Guyana Gold 1910   0.000000   0 42.43048         0 154.45527 4.860416 
  -58.9301

it seems that it does read the data but it does not show it. and i have a problem with creating the choropleth map. which it does not work now in my shiny.


Solution

  • Yeah, leaflet is finicky. I didn't have to make a lot of changes, you almost had it. One of the main problems was that your filter was usually yielding an empty dataframe which caused the markers not to show (of course).

    This empty dataframe problem is also the cause for the "ERROR: 'breaks' are not unique" message since colorQuantile is getting a null input for its domain argument, which means it is doing an empty quantile, and all the breaks are zero and thus "not unique". This can also happen with highly skewed data. You should avoid calling it in that case - maybe fallback on colorBin, although detecting that can be a bit complicated.

    The following changes were made.

    Here is the code - this should get you started:

    library(shiny)
    library(leaflet)
    
    # fake-up some data
    n <- 10000
    countrylist <- c("Guyana","Venezuela","Columbia")
    typelist <- c("Aluminium", "Gold","Iron", "Silver", "Zinc")
    types <- sample(typelist,n,replace=T)
    cntrs <- sample(countrylist,n,replace=T)
    lat <- 2.2 + 50*runif(n)
    long <- -46 + 50*runif(n)
    year <- sample(1910:2010,n,replace=T)
    prd <- 100*runif(n)
    
    
    myData <- data.frame(Country=cntrs,type=types,year=year,production=prd,Long=long,Lat=lat)
    
    u <- shinyUI(fluidPage(
    
      checkboxGroupInput("type", "Please Select production type:",
                    c("Aluminium", "Gold","Iron", "Silver", "Zinc"),
                    selected=c("Gold","Silver")
      ),
      sliderInput("year","Choose a Year", 
                  min = 1910,
                  max = 2010,
                  value= 2010),
      checkboxGroupInput("Economy", "Please Select Economy Factor:", 
                    c("Income Inequallity", "labourers Real Wage", "GDP", "Inflation")),
     # plotOutput("thisPlot"), 
      leafletOutput("myMap")
    )
    )
    
    s <- function(input,output){
    
      output$myMap <- renderLeaflet({
        temp <- which(myData$type %in% input$type &
                        myData$year == trunc(input$year))
        print(nrow(myData))
        myData <- myData[temp,]
        print(nrow(myData))
    
        pal <- colorQuantile("YlGn", myData$production, n = 9)
        country_popup <- paste0("<strong>Estado: </strong>", myData$Country)
    
        leaflet(data = myData) %>% 
          setView(-46.227638, 2.213749, zoom = 2) %>% 
          addTiles() %>% 
          addCircleMarkers( lng = ~Long, lat = ~Lat, 
                       fillColor = ~pal(myData$production), 
                       radius = 6, # pixels 
                       fillOpacity = 0.8, 
                       color = "black", 
                       weight = 1, 
                       popup = country_popup)
      })
    }
    shinyApp(u,s)
    

    And this is the result: enter image description here