I am trying to add a barchart to my dashboard in Shiny but I'm having issues when it comes to reshaping the data.
I want to display the number of Red/Amber/Green ratings for each metric and have this react based on the Country and Region selected.
The value boxes are working for the most part but all the ideas I've tried through searching SO have either resulted in no bar chart or errors.
My code:
Country <- c('England', 'Scotland', 'Wales', 'Ireland', 'Spain', 'England', 'Scotland', 'Wales', 'Ireland', 'Spain', 'England', 'Scotland', 'Wales', 'Ireland', 'Spain' , 'England', 'Scotland', 'Wales', 'Ireland', 'Spain')
Region <- c('North' , 'East', 'South', 'South', 'North' , 'South', 'East', 'North' , 'South', 'West', 'North' , 'South' , 'North' , 'West', 'North' , 'West', 'West', 'East', 'East', 'South')
Value <- c(100, 150, 400, 300, 100, 150, 300, 200, 500, 600, 300, 200, 250, 300, 100, 150, 300, 200, 500, 600)
Outcomes <- c('Green', 'Red','' , 'Amber', 'Green', 'Green', 'Red','' , 'Red', 'Amber', 'Red', 'Green', 'Green', 'Green','' ,'' , 'Amber', 'Amber', 'Red', 'Red')
Outputs <- c('Red', 'Green', 'Green', 'Green', '','' , 'Amber', 'Green', 'Red','' , 'Red', 'Amber', 'Red', 'Green', 'Green', '','' , 'Amber', 'Amber', 'Red')
Risk <- c('Green', 'Green', 'Red', 'Red','' , 'Amber', 'Green', 'Green', 'Amber','' , 'Green', 'Red', 'Amber', 'Green', 'Green', 'Red', '', 'Red', 'Amber', '')
Joined_data <- data.frame(Country, Region, Value, Outcomes, Outputs, Risk)
list<- unique(Joined_data$Country)
list2 <- unique(Joined_data$`Region`)
UI
ui<- dashboardPage(
dashboardHeader(title = "Performance", titleWidth = 800),
dashboardSidebar(selectizeInput(inputId = "Country", label = "Country", choices = c('All', list)),
(selectizeInput(inputId = "Region", label = "Region", choices = c('All', list2)))),
dashboardBody(
fluidRow(
box(valueBoxOutput(outputId = "Total", width = 12), title = "Total"),
box(valueBoxOutput(outputId = "Value", width = 12), title = "Value"),
plotOutput(outputId = "plot1", width = 600 , height = 600), title = "Metric RAG Rating",
)
),
)
server <- function(input, output, session) {
Test <- reactive({
if(input$Country == 'All') {
Joined_data
} else {
Joined_data %>%
filter(`Country` == input$Country, `Region` == input$Region)
}})
output$Total <- renderValueBox({
valueBox(Test() %>%
tally(),
req(input$Country),
color = "olive")
})
output$Value <- renderValueBox({
valueBox(Test() %>%
summarise("Value" = sum(`Value (Annualised)`)) %>%
prettyNum(big.mark = ","),
req(input$Country),
color = "olive", icon = icon("pound-sign"))
})
output$plot1 <-renderPlot({
Test() %>%
gather(metric, RAG, Outcomes:Risk) #%>%
group_by(metric, RAG) %>%
dplyr::summarise(n = n())
ggplot(data= Test(), aes(x= metric, y= n, color = RAG, fill = RAG, title = "RAG Rating")) +
geom_bar(stat = "identity", position=position_dodge())
req(input$Region)
})
Country.choice <- reactive({
Joined_data %>%
filter(`Country` %in% input$Country) %>%
pull(`Region`)
})
observe({
updateSelectizeInput(session, "Region", choices = Country.choice())
})
}
shiny::shinyApp(ui=ui,server=server)
I am getting an error - object 'metric' not found. so it must be something to do with gather()
Anyone have any ideas?