I have two maps in the dashboard and first map can plot data directly from the dataframe. But the second map need some modifications to the dataframe before plotting. I need to make a distance matrix and then cluster the data based on the distance and then plot each cluster with the route using leaflet. The codes are working outside Shiny. Could someone please tell me how to make the script run in the shiny app?
state<- c(State1,State1,State1,State1,State1,State1,State1,State1,State1,State1,State1,State1,State1,State1,State1,State1,State1,State1,State1)
district<- c(D1,D2,D3,D4,D5,D6,D7,D1,D2,D3,D1,D1,D2,D3,D4,D5,D6,D7,D4)
block<- c(B1,B2,B3,B4,B5,B6,B7,B1,B2,B3,B4,B5,B6,B7,B4,B5,B6,B7,B4)
person<- c(dr1,dr2,dr3,dr4,dr5,dr6,dr1,dr2,dr3,dr4,dr5,dr6,dr1,dr2,dr3,dr4,dr5,dr6,dr6)
village<- c(V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12,V13,V14,V15,V16,V17,V18,V19)
Store<- c(S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15,S16,S17,S18,S19)
ID<- c(165,633,634,637,638,640,641,643,644,645,646,648,649,651,652,653,655,657,658)
lon<- c(25.823541,25.828866,25.806883,25.837276,25.877259,25.915215,25.843175,25.68656,25.856703,25.853131,25.834961,25.797713,25.695643,25.762921,25.747861,25.745232,25.796351,25.840904,25.793371)
lat<- c(84.103431,84.416118,84.477473,84.106071,84.147636,84.20334,84.300451,84.185715,84.026747,84.007323,83.921804,84.184888,84.222116,84.171704,84.209929,84.236606,84.252738,84.06844,84.049946)
ba<- data.frame(state,district,block,person,village,Store,ID,lon,lat)
district<- c(d1,d2,d3,d4,d5,d6)
village<- c(V1,V2,V3,V4,V5,V6)
driver<- c(dr1,dr2,dr3,dr4,dr5,dr6)
lat<- c(84.141826,84.216667,84.104059,83.868195,84.155507,84.210588)
lon<- c(25.759589,25.877103,25.86034,25.972437,25.766596,25.882357)
driver <-data.frame(district,village,driver,lat,lon)
library(shiny)
library(sf)
library(sp)
library(tidyverse)
library(osrm)
library(leaflet)
library(dplyr)
library(geosphere)
Name.Person = c("dr1",
"dr2",
"dr3",
"dr4")
Name.cluster = c('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15')
ui <- fluidPage(
titlePanel("Mapping"),
sidebarLayout(
sidebarPanel(
selectInput("Person",
"Please Pick the Name of the Person:",
choices = Name.Person),
selectInput("cluster",
"Please Pick the Cluster:",
choices = Name.cluster),
mainPanel(
fluidRow(column(12,
"Total Places by Person)",
leafletOutput("full"))
),
fluidRow(column( 12,
"Route for the Selected Cluster",
leafletOutput("by_cluster")
),
fluidRow(column( 12,
"Route for the Selected Cluster",
)
))
)
))
server <- function(input, output) {
person <- reactive({
dplyr::filter(ba, person == input$Person)
})
output$cluster <- reactive({
(input$cluster )
})
size <- reactive({
(input$size )
})
# script that is not working in the shiny
df00 <- ba
Distance<- distm(df00[9:10],df00[9:10],fun = distHaversine)
Distance<- as.data.frame(Distance)
Distance[is.na(Distance)]<-0
DMat<- as.dist(Distance)
hc1 <- hclust(as.dist(DMat), method="complete")
df00$Clusters<- cutree(hc1, k=15)
# creating table by cluster
df1 <- df00 %>% filter(Clusters == 15)
df1a <- df1[,c(5,9,10)]
colnames(df1a) <- c('name',"lon","lat")
#load location file with clusre and person details
driver <- driver
driver <- driver [,c(4,6,7)]
driver <- driver[driver$name == "Driver1", ]
#output
df.f <- rbind(driver,df1a)
df.f <- df.f[,c(1,3,2)]
trip <- osrmTrip(df.f)
trip_sp <- trip[[1]]$trip
st_geometry(trip_sp) <- NULL
output$full <- renderLeaflet({
fc <- person()
factpal <- colorFactor(topo.colors(2), domain = df00$telehealth)
leaflet(data = fc ) %>%
addTiles() %>%
addCircleMarkers(lng = fc$lon, lat = fc$lat,
color = ~factpal(telehealth),
label = fc$Clusters,
popup = fc$ID,
labelOptions = labelOptions(noHide = T)) %>%
addLegend("bottomright", pal = factpal, values = ~telehealth,
title = "Clustering",
labFormat = labelFormat(prefix = "No. of "))
})
output$by_cluster <- renderLeaflet({
leaflet(data = trip_sp) %>%
addTiles() %>%
addMarkers(lng = cluster$lon, lat = cluster$lat, label =cluster$CHE.Village, labelOptions = labelOptions(noHide = T)) %>%
addPolylines()
})
}
shinyApp(ui = ui, server = server)