14.2 Build an awesome flexdadhboard

Here we build our awesome flexdadhboard with shiny using the data from the World Bank: https://datacatalog.worldbank.org/

14.2.1 Download the data

To download the data from the World Bank we need {wbstats} package.

library(wbstats)
# wbdatacatalog()
# https://datacatalog.worldbank.org/

This function helps locating the data from the database, we need to specify the language of the data.

?wb_cache
list <- wb_cache("en")
indicators <- list$indicators

Selecting PM25 we can retrieve the data used in the book.

library(tidyverse)

indicators%>%
  filter(str_detect(indicator_id,"PM25"))
## # A tibble: 5 × 8
##   indicator_id         indicator     unit  indic…¹ sourc…² topics sourc…³ source
##   <chr>                <chr>         <lgl> <chr>   <chr>   <list>   <dbl> <chr> 
## 1 EN.ATM.PM25.MC.M3    PM2.5 air po… NA    Popula… Brauer… <df>         2 World…
## 2 EN.ATM.PM25.MC.T1.ZS PM2.5 pollut… NA    Percen… Brauer… <df>         2 World…
## 3 EN.ATM.PM25.MC.T2.ZS PM2.5 pollut… NA    Percen… Brauer… <df>         2 World…
## 4 EN.ATM.PM25.MC.T3.ZS PM2.5 pollut… NA    Percen… Brauer… <df>         2 World…
## 5 EN.ATM.PM25.MC.ZS    PM2.5 air po… NA    Percen… Brauer… <df>         2 World…
## # … with abbreviated variable names ¹​indicator_desc, ²​source_org, ³​source_id

But, for making our flexdashboard we select other data, this data contains information about Poverty Severity Values, the amount of low wages which range from 0.00usd to 4.00usd a day, in specific countries of the South America.

# select this indicator id:

# 1.1.PSev.1.90usd
# Poverty Severity ($1.90 a day)-Rural


indicators%>%
  filter(str_detect(indicator,"Severity"))%>%
  head(3)
## # A tibble: 3 × 8
##   indicator_id      indicator        unit  indic…¹ sourc…² topics sourc…³ source
##   <chr>             <chr>            <lgl> <chr>   <chr>   <list>   <dbl> <chr> 
## 1 1.0.PSev.1.90usd  Poverty Severit… NA    The po… LAC Eq… <df>        37 LAC E…
## 2 1.0.PSev.2.5usd   Poverty Severit… NA    The po… LAC Eq… <df>        37 LAC E…
## 3 1.0.PSev.Poor4uds Poverty Severit… NA    The po… LAC Eq… <df>        37 LAC E…
## # … with abbreviated variable names ¹​indicator_desc, ²​source_org, ³​source_id

We can select a specific year with wb_data()

p <- wb_data(indicator = "1.0.PSev.1.90usd")

p %>%count(date)

Then we can download the data for chosen year:

p_14_190 <- wb(indicator = "1.0.PSev.1.90usd",
                startdate = 2014, 
                enddate = 2014)
p_14_250 <- wb(indicator = "1.0.PSev.2.5usd",
                startdate = 2014, 
                enddate = 2014)

p_14_4uds <- wb(indicator = "1.0.PSev.Poor4uds",
                startdate = 2014, 
                enddate = 2014)


p_14 <- dplyr::bind_rows(p_14_190,p_14_250,p_14_4uds)
p_14%>%head
##   iso3c date     value      indicatorID                      indicator iso2c
## 1   ANR 2014 1.0656694 1.0.PSev.1.90usd Poverty Severity ($1.90 a day)    L5
## 2   ARG 2014 0.7833897 1.0.PSev.1.90usd Poverty Severity ($1.90 a day)    AR
## 3   BOL 2014 2.0466247 1.0.PSev.1.90usd Poverty Severity ($1.90 a day)    BO
## 4   BRA 2014 1.1711453 1.0.PSev.1.90usd Poverty Severity ($1.90 a day)    BR
## 5   MCA 2014 1.0658485 1.0.PSev.1.90usd Poverty Severity ($1.90 a day)    L6
## 6   COL 2014 1.4215912 1.0.PSev.1.90usd Poverty Severity ($1.90 a day)    CO
##           country
## 1   Andean Region
## 2       Argentina
## 3         Bolivia
## 4          Brazil
## 5 Central America
## 6        Colombia

14.2.2 Build the map

We can use this data to build our map:

library(rnaturalearth)

map <- ne_countries()
names(map)[names(map) == "iso_a3"] <- "ISO3"
names(map)[names(map) == "name"] <- "NAME"

map$PSev <- p_14[match(map$ISO3, p_14$iso3c), "value"] 

map$PSev <- round(map$PSev,4)
library(leaflet)

pal <- colorBin(
  palette = "viridis", 
  domain = map$PSev,
  bins = seq(0, 3.5, by = 0.5)
)


  leaflet(map) %>%
    addTiles() %>%
    setView(lng = -70, lat = -10, zoom = 3) %>%
    addPolygons(stroke = TRUE,
                weight = 1,
      fillColor = ~ pal(PSev),
      color = ~ pal(PSev),
      fillOpacity = 0.2,
      # label = ~labels,
      highlight = highlightOptions(
        color = "black",
        bringToFront = TRUE
      )
    ) %>%
    leaflet::addLegend(na.label = "Na",
      pal = pal, values = ~PSev,
      opacity = 0.5, title = "PSev"
    )
Our awesome flexdashboard will look like this: