## DATA SCIENCE IN A PANDEMIC
## Professor Dennis F.X. Mathaisel
## This script entails a data visualization, a geographic map, referenced as Figure 5 in the paper.
# The script was originally produced by Thibaut FABACHER
# The dataset utilized are from Johns Hopkins University and the original producer ##
# The script has been modified by Veo Chae
library(shiny) library(leaflet) library(RColorBrewer) library(rgdal) library(RCurl) library(plotly) library(viridis) library(tidyverse)
variable <-F
#loading the masterfile the original producer has created. load(“C:/Users/dchae2/Desktop/Visualizations/Geographic Confirmed Cases/data/shapeFile.RData”)
#function that alters names of the regions to a official names. dataCook<- function(data, pop, countries){
data$`Country/Region`<-as.character(data$`Country/Region`) data$`Country/Region`[data$`Country/Region`==”Macau”]<- “Macao” data$`Country/Region`[data$`Country/Region`==”Mainland China”]<-
“China”
data$`Country/Region`[data$`Country/Region`==”South Korea”]<- “South Korea”
data$`Country/Region`[data$`Country/Region`==”North Macedonia”]<- “Macedonia”
data$`Country/Region`[data$`Country/Region`==”Czech Republic”]<- “Czechia”
data$`Country/Region`[data$`Country/Region`==”Dominican Republic”]<- “Dominican Rep.”
data$`Country/Region`[data$`Country/Region`==”UK”]<- “United Kingdom” data$`Country/Region`[data$`Country/Region`==”Gibraltar”]<- “United
Kingdom”
data$`Country/Region`[data$`Country/Region`==”US”]<- “United States” data$`Country/Region`[data$`Country/Region`==”Saint Barthelemy”]<- “St-
Barth√©lemy”
data$`Country/Region`[data$`Country/Region`==”Faroe Islands”]<- “Faeroe Is.”
data$`Country/Region`[data$`Country/Region`==”Bosnia and Herzegovina”]<- “Bosnia and Herz.”
data$`Country/Region`[data$`Country/Region`==”Vatican City”]<- “Vatican”
data$`Country/Region`[data$`Country/Region`==”Korea, South”]<- “South Korea”
data$`Country/Region`[data$`Country/Region`==”Republic of Ireland”]<- “Ireland”
data$`Country/Region`[data$`Country/Region`==”Taiwan*”]<-“Taiwan”
data$`Country/Region`[data$`Country/Region`==”Congo (Kinshasa)”]<- “Congo”
data$`Country/Region`[data$`Country/Region`==”Cote d’Ivoire”]<-“C√¥te d’Ivoire”
data$`Country/Region`[data$`Country/Region`==”Reunion”]<-“France” data$`Country/Region`[data$`Country/Region`==”Martinique”]<-“France” data$`Country/Region`[data$`Country/Region`==”French Guiana”]<-“France” data$`Country/Region`[data$`Country/Region`==”Holy See”]<-“Vatican” data$`Country/Region`[data$`Country/Region`==”Cayman Islands”]<-“Cayman
Is.”
data$`Country/Region`[data$`Country/Region`==”Guadeloupe”]<-“France” data$`Country/Region`[data$`Country/Region`==”Antigua and Barbuda”]<-
“Antigua and Barb.”
data$`Country/Region`[data$`Country/Region`==”Curacao”]<-“Cura√ßao” data$`Country/Region`[data$`Country/Region`==”Guadeloupe”]<-“France” data$`Country/Region`[data$`Country/Region`==”occupied Palestinian
territory”]<-“Palestine” data$`Country/Region`[data$`Country/Region`==”Congo (Brazzaville)”]<-
“Congo”
data$`Country/Region`[data$`Country/Region`==”Equatorial Guinea”]<- “Guinea”
data$`Country/Region`[data$`Country/Region`==”Central African Republic”]<-“Central African Rep.”
data$`Country/Region`[data$`Country/Region`==”South Sudan”]<-“S. Sudan” data$`Country/Region`[data$`Country/Region`==”Eswatini”]<-“eSwatini” data$`Country/Region`[data$`Country/Region`==”Western Sahara”]<-“W.
Sahara”
data$`Country/Region`[data$`Country/Region`==”Burma”]<-“Myanmar” data$`Country/Region`[data$`Country/Region`==”Sao Tome and Principe”]<-
“S√£o Tom√© and Principe” data$`Country/Region`[data$`Country/Region`==”Saint Vincent and the
Grenadines”]<-“St. Vin. and Gren.” data$`Country/Region`[data$`Country/Region`==”Saint Kitts and Nevis”]<-
“St. Kitts and Nevis”
# countries$NAME<-as.character(countries$NAME)
# countries$NAME[is.na(countries$NAME)]<-“C√¥te d’Ivoire” data$Pays<-
as.character(unique(countries$NAME)[charmatch(data$`Country/Region`,uniqu e(countries$NAME))])
print(data$`Country/Region`[is.na(data$Pays)])
dataPays<- data%>%dplyr::select(-`Province/State`, -Lat, -Long,-
`Country/Region`)%>%group_by(Pays)%>%summarise_each(sum)
dataPays$Pays<-as.character(dataPays$Pays)
return(dataPays)
}
#loading the population size of each countries –> provided by the original creator.
population<- read.csv2(“C:/Users/dchae2/Desktop/Visualizations/Geographic Confirmed Cases/data/pop.csv”,stringsAsFactors = F)
population$pays<- as.character(unique(countries$NAME)[charmatch(population$Country,unique(c ountries$NAME))])
#The data source has been altered from using getURL –> actual CSV file.
The CSV file is attached within the file
#This is the John’s Hopkins University Worldwide COVID-19 Dataset data <- read.csv(“C:/Users/dchae2/Desktop/Visualizations/Geographic Confirmed Cases/data/time_series_covid19_confirmed_global.csv”, check.names = F)
dataCases<- dataCook(data, pop, countries)
data <- read.csv(“C:/Users/dchae2/Desktop/Visualizations/Geographic Confirmed Cases/data/time_series_covid19_deaths_global.csv”, check.names
= F)
dataDeaths<- dataCook(data, pop, countries)
#Changing the format of variables according to its proper format: Date, Numeric and character.
#also filtering out the NAs
#merging the dataset into data (Confirmed) Cases and data (Confirmed)
Deaths for each country
dataPays<-function(data=dataCases) return(data) jour<-names(dataCases%>%select(contains( “/”))) jourDate<- as.Date(jour, “%m/%d/%y”)
names(dataCases)[str_detect(names(dataCases), “/”)]<- format.Date(jourDate, “%m/%d/%y”) names(dataDeaths)[str_detect(names(dataDeaths), “/”)]<- format.Date(jourDate, “%m/%d/%y”)
dataCases<-left_join(data.frame(Pays = countries$NAME%>%as.character(), Pop =countries$POP_EST%>%as.character()%>%as.numeric()),dataCases) dataCases<-dataCases%>%filter(!is.na(Pays))
dataDeaths<-left_join(data.frame(Pays = countries$NAME%>%as.character(), Pop =countries$POP_EST%>%as.character()%>%as.numeric()),dataDeaths) dataDeaths<-dataDeaths%>%filter(!is.na(Pays))
arrondi<- function(x) 10^(ceiling(log10(x)))
dataDeaths[,3]<-ifelse(is.na(dataDeaths[,3]),0,dataDeaths[,3]) dataCases[,3]<-ifelse(is.na(dataCases[,3]),0,dataCases[,3]) for(i in 4: dim(dataDeaths)[2]) dataDeaths[,i]<- ifelse(is.na(dataDeaths[,i]), dataDeaths[,i-1],dataDeaths[,i])
for(i in 4: dim(dataCases)[2]) dataCases[,i]<- ifelse(is.na(dataCases[,i]), dataCases[,i-1],dataCases[,i])
#Creating UI
ui <- bootstrapPage(
tags$style(type = “text/css”, “html, body {width:100%;height:100%}”, HTML( “.panel-default {background-color: rgb(256, 256,
256,0.5);
),
padding : 10px;;}
.panel-title {background-color: rgb(256, 256, 256,0.8); padding : 10px;
border-style: solid; border-color: grey;}
.panel-credits {background-color: rgb(256, 256, 256,1); padding : 15px;
border-style: solid; border-color: black;}
.panel-mobile {background-color: rgb(256, 256, 256,0); padding : 15px;
box-shadow: unset;} “)
leafletOutput(“map”, width = “100%”, height = “93%”), column(6,HTML(“<b><a href=’https://www.linkedin.com/in/thibaut-
fabacher’>Thibaut FABACHER</a></b></br>
<i>Groupe Methode en Recherche Clinique (Pr. MEYER) <a href=’http://www.chru-strasbourg.fr/’ target =’_blank’> CHRU STRASBOURG</a></br>Laboratoire de Biostatistique (Pr. SAULEAU)<a href=’https://icube.unistra.fr/’ target =’_blank’> ICUBE</a></i>”)),
column(2,br(), actionButton(“twitter_share”,
label = “Share”,
icon = icon(“twitter”),
onclick = sprintf(“window.open(‘%s’)”,url))
),
column(2,br(),
checkboxInput(“plotEvolT”, “Show Evolution”,F)
),
column(2, br(),checkboxInput(“credits”, “Credits”, FALSE)),
absolutePanel(id = “input_date_control”,class = “panel panel- default”,bottom = 60, left = 10, draggable = F,
selectInput(“choices”, “Cases or Deaths ?”, choices = c(“Cases”,”Deaths”),selected = “Cases”),
uiOutput(“Slider”),
helpText(“The detail of each country can be obtained by clicking on it.”),
uiOutput(“selection”), checkboxInput(“legend”, “Show legend”, TRUE)
),
absolutePanel(id = “mobile”,class = “panel panel-mobile”,top = 10, right = 10, HTML(“<a href=’https://thibautfabacher.shinyapps.io/covid- 19-m/’>Mobile Version</a>”)),
uiOutput(“Credits”), uiOutput(“mobile”), uiOutput(“plotEvol”),
absolutePanel(id = “name”,class = “panel panel-title”,top = 10, left
= 100, HTML(“<h1>COVID-19 outbreak</h1>”),draggable = T)
)
server <- function(input, output, session) {
dataPays<- reactive({ if(!is.null(input$choices)){
if(input$choices == “Cases”){ return( dataCases)
}else{
return( dataDeaths)
}}
})
maxTotal<- reactive( max(dataPays()%>%select(- Pop)%>%select_if(is.numeric), na.rm = T)
)
maxTotalPrevalence<- reactive(max(dataPays()%>%select(- Pop)%>%select_if(is.numeric)%>%mutate_all(function(x) x/dataPays()$Pop*100000), na.rm = T)
) # #
Top5<-reactive( unique(c(dataPays()$Pays[order(dataPays()[,dim(dataPays())[2]]%>%unlist()
,decreasing = T)][1:5]
,”France”)))
#
# #
output$map <- renderLeaflet({
# Use leaflet() here, and only include aspects of the map that # won’t need to change dynamically (at least, not unless the # entire map is being torn down and recreated).
leaflet(data = countries) %>% setView(0, 30, zoom = 3)
})
pal <- reactive(colorNumeric(c(“#FFFFFFFF” ,rev(inferno(256))), domain
= c(0,log(arrondi(maxTotal())))))
pal2 <- reactive(colorNumeric(c(“#FFFFFFFF” ,rev(inferno(256))), domain
= c(0,log(arrondi(maxTotalPrevalence())))))
observe({
casesDeath<- ifelse(input$choices == “Cases”,”Cases”,”Deaths”) if (!is.null(input$day1)) {
indicator<-format.Date(input$day1, “%m/%d/%y”)
}else{
indicator = format.Date(max(jourDate), “%m/%d/%y”)
}
if (!is.null(input$day2)) {
indicator2<-format.Date(input$day2-c(1,0), “%m/%d/%y”)
}else{
indicator2 =format.Date(c(min(jourDate)-1,max(jourDate)), “%m/%d/%y”)
}
if(is.null(input$variable)){
}else{
variable<- input$variable
if(variable ==”Total cases/population”){ # nCases
countries2 <- merge(countries,
dataPays(), by.x = “NAME”,
by.y = “Pays”, sort = FALSE)
country_popup <- paste0(“<strong>Country: </strong>”,
countries2$NAME, “<br><strong>”,
“Total cases/population :”,
” </strong>”, round(countries2[[indicator]]/countries2$Pop*100000,2),” /100 000″)
leafletProxy(“map”, data = countries2)%>% addPolygons(fillColor =
pal2()(log((countries2[[indicator]]/countries2$Pop*100000)+1)),
layerId = ~NAME, fillOpacity = 1, color = “#BDBDC3”,
weight = 1,
popup = country_popup)
}else if(variable ==”Total cases”){ countries2 <- merge(countries,
dataPays(), by.x = “NAME”,
by.y = “Pays”, sort = FALSE)
country_popup <- paste0(“<strong>Country: </strong>”,
countries2$NAME, “<br><strong>”,
“Total “,casesDeath,” :”,
” </strong>”, round(countries2[[indicator]],2))
leafletProxy(“map”, data = countries2)%>% addPolygons(fillColor =
pal()(log((countries2[[indicator]])+1)),
fillOpacity = 1, layerId = ~NAME, color = “#BDBDC3”, weight = 1,
popup = country_popup)
}else if(variable ==”New cases over period”){ dataPaysSel<-dataPays()%>%select(Pays, Pop)
if(indicator2[1] == format.Date(min(jourDate)-1, “%m/%d/%y”)){
dataPaysSel$ncases<-dataPays()[,indicator2[2]]
}else{
dataPaysSel$ncases<-dataPays()[,indicator2[2]]- dataPays()[,indicator2[1]]
}
# nCases
countries2 <- merge(countries,
dataPaysSel, by.x = “NAME”,
by.y = “Pays”, sort = FALSE)
country_popup <- paste0(“<strong>Country: </strong>”,
countries2$NAME, “<br><strong>”,
“New “,casesDeath,” over period :”, ” </strong>”,
countries2$ncases)
leafletProxy(“map”, data = countries2)%>% addPolygons(fillColor = pal()(log(countries2$ncases+1)),
fillOpacity = 1, color = “#BDBDC3”, layerId = ~NAME, weight = 1,
popup = country_popup)
}else{
dataPaysSel<-dataPays()%>%select(Pays, Pop)
if(indicator2[1] == format.Date(min(jourDate)-1, “%m/%d/%y”)){
dataPaysSel$ncases<-dataPays()[,indicator2[2]]
}else{
dataPaysSel$ncases<-dataPays()[,indicator2[2]]- dataPays()[,indicator2[1]]
}
# nCases
countries2 <- merge(countries,
dataPaysSel, by.x = “NAME”,
by.y = “Pays”, sort = FALSE)
country_popup <- paste0(“<strong>Country: </strong>”,
countries2$NAME, “<br><strong>”,
“New “,casesDeath,” over period /
population :”,
” </strong>”, round(countries2$ncases/countries2$Pop*100000,2),” /100 000″)
leafletProxy(“map”, data = countries2)%>% addPolygons(fillColor =
pal2()(log(countries2$ncases/countries2$Pop*100000+1)),
fillOpacity = 1, color = “#BDBDC3”, layerId = ~NAME, weight = 1,
popup = country_popup)
}
}
}
)
observe({ if(is.null(input$variable)){
}else{
variable<- input$variable
proxy <- leafletProxy(“map”, data = countries)
# Remove any existing legend, and only if the legend is # enabled, create a new one.
proxy %>% clearControls() if (input$legend) {
if(variable %in% c(“Total cases/population”,”New cases over period/population”)){
proxy %>% addLegend(position = “bottomright”,
pal = pal2(),opacity = 1, bins =
log(10^(seq(0,log10(arrondi(maxTotalPrevalence())),0.5))),
value = log(1:10^(log10(arrondi(maxTotalPrevalence())))),
data
=log(1:10^(log10(arrondi(maxTotalPrevalence())))),
labFormat = labelFormat(transform = function(x) round(exp(x)) ,suffix = ” /100 000″)
)
}else{
proxy %>% addLegend(position = “bottomright”,
pal = pal(),opacity = 1, bins =
log(10^(0:log10(arrondi(maxTotal())))),
value = log(1:10^(log10(arrondi(maxTotal())))),
data = log(10^(0:log10(arrondi(maxTotal())))),
labFormat = labelFormat(transform = exp )
)
}
}
}
})
output$Slider<-renderUI({ if(is.null(input$variable)){
}else{
if(input$variable %in% c(“Total cases”, “Total cases/population”)){ sliderInput(“day1”, “Day”, min(jourDate), max(jourDate),
value = c(max(jourDate)),animate = T, step = 1
#min(jourDate),
)}else{
sliderInput(“day2”, “Day”, min(jourDate), max(jourDate),
value = c(max(jourDate)-7,max(jourDate)),animate =
T, step = 1
)
}
}
})
#min(jourDate),
output$selection <- renderUI({ if(input$choices ==”Cases”){
radioButtons(“variable”, choices = c(“New cases over period”,
“New cases over period/population”,”Total cases”, ‘Total cases/population’ ),
label = “Indicator”)
}else{
radioButtons(“variable”, choices = list(“Deaths over period”=”New cases over period”,
“Deaths over period/population”=”New cases over period/population”,
“Total deaths”=”Total
cases”,
deaths/population’=’Total cases/population’ ),
label = “Indicator”)
‘Total
}
})
output$plotEvol<-renderUI({ if (input$plotEvolT) {
tagList(absolutePanel( id = “name”,
class = “panel panel-credits”, top = 10,width = “700px”, right = 10,draggable = F,
plotlyOutput(outputId = “evol”,width = “600px”), actionButton(“reset”, “Reset Graph”), actionButton(“clear”, “Clear all traces”)
))
}
})
output$evol <-renderPlotly({
if(input$variable %in% c(“Total cases/population”,”Total cases”)){ df_evo<- dataPays()%>%filter(Pays%in%
trace$data)%>%pivot_longer(cols = -c(Pays,Pop),
values_to = “Cases”,names_to = “Date”)%>%
mutate(Date= lubridate::parse_date_time(Date, orders = c(“mdy”))) if(input$variable==”Total cases/population”){
plot_ly(data = df_evo,x = ~Date, y = ~Cases/Pop*100000, color =
~Pays, type = “scatter”,mode = “lines”)%>%
layout(yaxis = list( title = paste(input$choices,”/ 100 000″)))
}else{
plot_ly(data = df_evo,x = ~Date, y = ~Cases, color = ~Pays, type
= “scatter”,mode = “lines”)%>%
layout(yaxis = list( title = input$choices))
}
}else{
df_evo<- dataPays()%>%filter(Pays%in% trace$data)
for(i in dim( df_evo)[2]:4) df_evo[i]<- df_evo[i]- df_evo[i-1] df_evo<- df_evo%>%pivot_longer(cols = -c(Pays,Pop),
values_to = “Cases”,names_to =
“Date”)%>%
mutate(Date= lubridate::parse_date_time(Date, orders = c(“mdy”)))
if( input$variable==”New cases over period/population”){ plot_ly(data = df_evo,x = ~Date, y = ~Cases/Pop*100000, color =
~Pays, type = “scatter”,mode = “lines”)%>%
layout(yaxis = list( title = paste(input$choices,”/ 100 000/day”)))
}else{
plot_ly(data = df_evo,x = ~Date, y = ~Cases, color = ~Pays, type
= “scatter”,mode = “lines”)%>%
layout(yaxis = list( title = paste(input$choices,”/day”)))
}
}
})
trace<- reactiveValues() observe({trace$data<-Top5()
})
observeEvent(input$reset, {
for (i in 1: length(trace$data)){ plotlyProxy(“evol”, session) %>%
plotlyProxyInvoke(“deleteTraces”,list(0))
}
if(input$variable %in% c(“Total cases/population”,”Total cases”)){
df_evo<- dataPays()%>%filter(Pays%in% Top5())%>%pivot_longer(cols =
-c(Pays,Pop),
values_to = “Cases”,names_to = “Date”)%>%
mutate(Date= lubridate::parse_date_time(Date, orders = c(“mdy”)))
if(input$variable==”Total cases/population”){ for (i in Top5()){
df_evoi<- df_evo%>%filter(Pays == i) plotlyProxy(“evol”, session) %>%
plotlyProxyInvoke(“addTraces”,
list(x =df_evoi$Date , name =i ,
y = df_evoi$Cases/df_evoi$Pop*100000, type = ‘scatter’,
mode = ‘lines’))
}
}else{
for (i in Top5()){
df_evoi<- df_evo%>%filter(Pays == i) plotlyProxy(“evol”, session) %>%
plotlyProxyInvoke(“addTraces”,
list(x =df_evoi$Date , name =i ,
y = df_evoi$Cases, type = ‘scatter’, mode = ‘lines’))
}
}
}else{
df_evo<- dataPays()%>%filter(Pays%in% Top5())
for(i in dim(df_evo)[2]:4) df_evo[i]<-df_evo[i]-df_evo[i-1]
df_evo<-df_evo%>%pivot_longer(cols = -c(Pays,Pop),
values_to = “Cases”,names_to =
“Date”)%>%
mutate(Date= lubridate::parse_date_time(Date, orders = c(“mdy”))) if( input$variable==”New cases over period/population”){
for (i in Top5()){
df_evoi<- df_evo%>%filter(Pays == i) plotlyProxy(“evol”, session) %>%
plotlyProxyInvoke(“addTraces”,
list(x =df_evoi$Date , name =i ,
y = df_evoi$Cases/df_evoi$Pop*100000, type = ‘scatter’,
mode = ‘lines’))
}
}else{
for (i in Top5()){
df_evoi<- df_evo%>%filter(Pays == i) plotlyProxy(“evol”, session) %>%
plotlyProxyInvoke(“addTraces”,
list(x =df_evoi$Date , name =i ,
y = df_evoi$Cases, type = ‘scatter’,
mode = ‘lines’))
}
}
}
trace$data<-Top5()
})
observeEvent(input$clear, {
for (i in 1: length(trace$data)){ plotlyProxy(“evol”, session) %>%
plotlyProxyInvoke(“deleteTraces”,list(0))
}
trace$data<- NULL
})
observeEvent(input$map_shape_click, {
country_Click<- input$map_shape_click$id
if (!country_Click%in%trace$data & input$plotEvolT){ trace$data<-c(trace$data,country_Click)
if(input$variable %in% c(“Total cases/population”,”Total cases”)){ df_click<- dataPays()%>%filter(Pays%in%
country_Click)%>%pivot_longer(cols = -c(Pays,Pop),
values_to = “Cases”,names_to = “Date”)%>%
mutate(Date= lubridate::parse_date_time(Date, orders =
c(“mdy”)))
if(input$variable==”Total cases/population”){ plotlyProxy(“evol”, session) %>%
plotlyProxyInvoke(“addTraces”,
list(x =df_click$Date , name =country_Click , y =
df_click$Cases/df_click$Pop*100000,
}else{
type = ‘scatter’, mode = ‘lines’))
plotlyProxy(“evol”, session) %>% plotlyProxyInvoke(“addTraces”,
list(x =df_click$Date , name =country_Click , y = df_click$Cases, type = ‘scatter’, mode = ‘lines’))
}
}else{
df_click<- dataPays()%>%filter(Pays%in% country_Click)
for(i in dim( df_click)[2]:4) df_click[i]<- df_click[i]- df_click[i-1]
df_click<- df_click%>%pivot_longer(cols = -c(Pays,Pop),
values_to = “Cases”,names_to =
“Date”)%>% c(“mdy”)))
mutate(Date= lubridate::parse_date_time(Date, orders =
if( input$variable==”New cases over period/population”){ plotlyProxy(“evol”, session) %>%
plotlyProxyInvoke(“addTraces”,
list(x =df_click$Date , name =country_Click , y =
df_click$Cases/df_click$Pop*100000,
}else{
type = ‘scatter’, mode = ‘lines’))
plotlyProxy(“evol”, session) %>% plotlyProxyInvoke(“addTraces”,
list(x =df_click$Date , name =country_Click , y = df_click$Cases, type = ‘scatter’, mode = ‘lines’))
}
}
}
})
output$mobile<- renderUI({
if (!input$plotEvolT) {
absolutePanel(id = “mobile”,class = “panel panel-mobile”,top = 10, right = 10, HTML(“<a href=’https://thibautfabacher.shinyapps.io/covid- 19-m/’>Mobile Version</a>”))
}
})
output$Credits <- renderUI({ if (input$credits) {
tagList( absolutePanel(
id = “name”,
class = “panel panel-credits”, top = “45%”,
left = “45%”, HTML(
“<h1> Data Source : </h1>
<p> <li><a href=’https://coronavirus.jhu.edu/map.html’>Coronavirus COVID-
19 Global Cases map Johns Hopkins University</a></li>
<li>COVID-19 Cases : <a href=’https://github.com/CSSEGISandData/COVID- 19′ target=’_blank’>Github Johns Hopkins University</a></li>
<li>World population : <a href=’https://en.wikipedia.org/wiki/List_of_countries_and_dependencies_by
_population’ target=’_blank’>Wikipedia</a></li>
<li>Shapefile : <a href=’https://www.naturalearthdata.com/downloads/50m-cultural- vectors/50m-admin-0-countries-2/’ target=’_blank’>Natural Earth Data</a></li>
<li> <a href =’https://github.com/DrFabach/Corona’ target=’_blank’>Code on Github </a></li>
<li> <a href = ‘https://www.r-project.org/’ target=’_blank’>The R Project for Statistical Computing</a></li>
<li> <a href = ‘https://shiny.rstudio.com/’ target=’_blank’>Shiny R package</a></li>
<li> <a href = ‘https://leafletjs.com/’ target=’_blank’>Leaflet
</a></li>
</p>”
),
draggable = T
)
)
}
})
}
shinyApp(ui, server)
© 2024 Babson College. All rights reserved.