Your problem is that your inputs eg. input$variable
return text. But you want the dplyr
functions such as filter
to use those inputs as if they were variables in your dataset, rather than text.
As an example:
# this fails because input_filter is a character vector and not a variable
my_filt_wrong <- function(data, input_filter, cond){
data %>%
filter(input_filter == cond)
}
my_filt_wrong(iris, 'Species', 'setosa')
#[1] Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#<0 rows> (or 0-length row.names)
# this works because we tell r to evaluate the input text as a variable
my_filt <- function(data, input_filter, cond){
data %>%
filter(!!sym(input_filter) == cond)
}
my_filt(iris, 'Species', 'setosa')
## A tibble: 50 x 5
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# <dbl> <dbl> <dbl> <dbl> <fct>
# 1 5.1 3.5 1.4 0.2 setosa
# 2 4.9 3 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5 3.6 1.4 0.2 setosa
If we replace your input$...
with !!sym(input$...)
where we want to refer to a variable in our dataset, the map should now work.
library(shiny)
library(dplyr)
library(leaflet)
library(readr)
CBdata <- read_csv("~/downloads/cblnglt.csv")
df0<- data.frame("cho"=c("No schooling completed","vocational","Bachelor","Post Graduate ","Single","Married","Divorced","others","male","female","under_20","21_30","31_39","31_40","41_50","51_59","over_60","Retired","Public_Employee","Private_Employee","Self_employeed","Unemployed","Others"),
"cat"=c("educ.","educ.","educ.","educ.","Relationship.Status","Relationship.Status","Relationship.Status","Relationship.Status","by_gender","by_gender","By_age","By_age","By_age","By_age","By_age","By_age","By_age","profession","profession","profession","profession","profession","profession"))
CBdata2<-as.data.frame(CBdata)
ui<-
navbarPage("Mapping Dashboard",
theme = "bootstrap.css",
tabPanel("tbd",
div( class= 'outer',
leafletOutput("mymap", width = "100%", height = "100%"),
absolutePanel(id = "controls", class = "panel panel-default",
fixed = TRUE,draggable = TRUE, top = "10%", left = "auto", right = 20, bottom = "auto",
width = 330, height = "auto", cursor = "move",br(),
selectInput("region", "Which governorate?", unique(CBdata$by_gov), selected = "Mumbai"),
selectInput("variable", "Filter by?", unique(df0$cat), selected = "by_gender"),
selectInput("sndvariable","sub filter",choices =NULL),
selectInput("indicator","select Indicator",c("xyz","abc"),
selected = "abc"),
plotOutput("bar", height = "250px")
)
)),
tabPanel("By Product",
tableOutput('mytable'))
)
server<-function(input,output,session){
observe({
TX<-df0 %>% filter(cat==input$variable)%>%select(cho)
updateSelectInput(session,"sndvariable","sub filter",choices = unique(TX))
})
CBD1<-reactive({
#browser
CBdata2 %>%
filter(!!sym(input$variable)==input$sndvariable,by_gov==input$region) %>%
group_by(lng,lat,!!sym(input$variable),by_gov,!!sym(input$indicator))%>%
arrange(desc(!!sym(input$indicator)))
})
CBD2<-reactive({
#browser
summarize(CBD1(), summation = sum(as.integer(!!sym(input$indicator))))
})
output$mytable <- renderTable(
CBD2()
)
output$mymap<-renderLeaflet({
CBD2() %>%
leaflet()%>%
addProviderTiles(provider = "CartoDB.DarkMatter")%>%
addCircleMarkers(lng=~lng, lat=~lat)
})
}
shinyApp(ui,server)