library(tidyverse) library(lubridate) library(dplyr) library(ggplot2) library(leaflet) library(shiny) library(shinydashboard) df <- read.csv(file = "crime.csv", header = TRUE, sep=",") #remove missing values df <- na.omit(df) #Preprocessing df$YEAR <- as.factor(df$YEAR) df$HOUR <- as.factor(df$HOUR) df$MONTH <- as.factor(df$MONTH) df$OCCURRED_ON_DATE <- as.POSIXct(df$OCCURRED_ON_DATE, format = "%Y-%m-%d %H:%M:%OS") row1 <- fluidRow( tabBox( title = "Crime Frequency", id = "tabset1", height = "250px", tabPanel("Per Month", plotOutput("permonth")), tabPanel("Per Weekday", plotOutput("perday")), tabPanel("Per Hour", plotOutput("perhour")) ) ,box(title = "Map View", solidHeader = TRUE ,collapsible = TRUE, leafletOutput("mymap")) ) #Creating another fluid row row2 <- fluidRow( box(title = "Stacked Plot", solidHeader = TRUE ,collapsible = TRUE, plotOutput("stacked")) ,box(title = "Timeseries Plot", solidHeader = TRUE ,collapsible = TRUE, plotOutput("timeseries")) ) ## Project Boston Crimes: UI - Header & Sidebars header <- dashboardHeader(title = "Boston Crime Dataset") sidebar <- dashboardSidebar( radioButtons("year", "Select Year: ", c("2015" = "2015", "2016" = "2016", "2017" = "2017", "2018" = "2018", "2019" = "2019")), selectInput("offense", "Offense Group:", c(unique(as.character(df$OFFENSE_CODE_GROUP[1:10])))), #Addition of a side bar menu to navigate to different tabs sidebarMenu( menuItem("Plots", tabName = "plots"), menuItem("Table", tabName = "table") ) ) #Adding components to body: body <- dashboardBody( tabItems( tabItem("plots", row1, row2), tabItem("table", dataTableOutput('table')) )) #Adding all components to UI: ui <- dashboardPage(header, sidebar, body) ## Project Boston Crimes: Server server <- function(input, output) { #creating a reactive object filtered <- reactive({ filter(filter(df, YEAR == input$year), OFFENSE_CODE_GROUP == input$offense) }) #creating the plotOutput content output$permonth <- renderPlot({ ggplot(data = filtered(), aes(x = filtered()$MONTH)) + geom_bar(fill="steelblue") + xlab("Month") + ylab("Number of Crimes") + theme_minimal() }) output$perday <- renderPlot({ ggplot(data = filtered(), aes(x = filtered()$DAY_OF_WEEK)) + geom_bar(fill="red") + xlab("Day of Week") + ylab("Number of Crimes") + theme_minimal() }) output$perhour <- renderPlot({ ggplot(data = filtered(),aes(x = filtered()$HOUR)) + geom_bar(fill="green") + xlab("Hour") + ylab("Number of Crimes") + theme_minimal() }) #Defining the timeseries plot output$timeseries <- renderPlot({ ggplot(data = filtered(), aes(x = filtered()$OCCURRED_ON_DATE))+ xlab("Date") + ylab("Number of Crimes") + geom_freqpoly(colour="purple") }) #Defining the newly created stacked plot output$stacked <- renderPlot({ filtered() %>% filter(DISTRICT %in% (filtered() %>% count(DISTRICT) %>% arrange(-n) %>% head(7) %>% pull(DISTRICT)), OFFENSE_DESCRIPTION %in% (filtered() %>% count(OFFENSE_DESCRIPTION) %>% arrange(-n) %>% head(5) %>% pull(OFFENSE_DESCRIPTION))) %>% ggplot(aes(DISTRICT, fill = OFFENSE_DESCRIPTION))+ geom_bar(position = "fill") }) output$mymap <- renderLeaflet({ dm <- data.frame(latitude = filtered()$Lat, longitude = filtered()$Long) leaflet(dm) %>% addProviderTiles("Stamen.TonerLite") %>% addMarkers( clusterOptions = markerClusterOptions() ) %>% setView(-71.1, 42.32, zoom = 12) }) output$table <- renderDataTable( filtered(), options = list(scrollX = TRUE) ) } ## Project Boston Crimes: Building Our App shinyApp(ui, server)