I recently developed an R Shiny application to filter and group data in rshiny. owever, I’ve encountered a specific issue that I haven’t been able to resolve. The problem arises when I attempt to group my dataframe based on the selection from a dropdown menu, which is linked to a variable named char_column_selector. When I group the dataframe using this dropdown selection, the lines in my plot disappear, making it difficult to visualize the data effectively.
library(shiny)
library(shinyWidgets)
library(dplyr)
library(plotly)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
selectInput("char_column_selector", "Select char_ Column", choices = NULL, selected = ""),
uiOutput("quantiles_input"),
uiOutput("value_bins_input"),
uiOutput("dynamic_inputs")
),
mainPanel(
h3("Dataset Overview"),
tableOutput("table"),
plotlyOutput("plot")
)
)
)
server <- function(input, output, session) {
data_loaded <- reactiveVal(FALSE)
dataset <- reactiveVal(NULL)
observe({
data <- tibble(
date = sample(seq.Date(as.Date('2023-01-01'), as.Date('2024-01-01'), by="day"), 100, replace = TRUE),
id = 1:100,
principal = round(runif(100, 1000, 10000), 2),
amount = round(runif(100, 500, 5000), 2),
char_age = sample(18:70, 100, replace = TRUE),
char_gender = sample(c("Male", "Female", "Other"), 100, replace = TRUE),
char_region = sample(c("North", "South", "East", "West"), 100, replace = TRUE),
char_score = sample(300:850, 100, replace = TRUE)
)
dataset(data)
data_loaded(TRUE)
})
char_columns <- reactive({
req(data_loaded())
names(dataset())[grepl("^char_", names(dataset()))]
})
observe({
updateSelectInput(session, "char_column_selector", choices = c("", char_columns()), selected = "")
})
output$dynamic_inputs <- renderUI({
req(data_loaded())
inputs <- lapply(char_columns(), function(col) {
if (is.numeric(dataset()[[col]])) {
numericRangeInput(inputId = col, label = col,
value = c(min(dataset()[[col]], na.rm = TRUE), max(dataset()[[col]], na.rm = TRUE)),
min = min(dataset()[[col]], na.rm = TRUE),
max = max(dataset()[[col]], na.rm = TRUE))
} else {
selectInput(inputId = col, label = col,
choices = unique(dataset()[[col]]),
selected = unique(dataset()[[col]]),
multiple = TRUE)
}
})
do.call(tagList, inputs)
})
filtered_data <- reactive({
req(data_loaded())
data <- dataset()
for (col in char_columns()) {
if (is.numeric(data[[col]])) {
range_vals <- input[[col]]
if (!is.null(range_vals)) {
data <- data %>% filter(data[[col]] >= range_vals[1] & data[[col]] <= range_vals[2])
}
} else {
selected_vals <- input[[col]]
if (!is.null(selected_vals) && length(selected_vals) > 0) {
data <- data %>% filter(data[[col]] %in% selected_vals)
}
}
}
data
})
value_bins <- reactive({
data <- filtered_data()
quantiles <- quantile(data$principal, probs = seq(0, 1, by = 0.25), na.rm = TRUE)
quantiles
})
output$value_bins_input <- renderUI({
quantiles_str <- paste(round(value_bins(), 2), collapse = ", ")
textInput("value_bins_text", label = "Quantiles of Principal", value = quantiles_str)
})
output$quantiles_input <- renderUI({
req(input$char_column_selector)
if (input$char_column_selector != "") {
selected_col <- filtered_data()[[input$char_column_selector]]
if (is.numeric(selected_col)) {
quantiles <- quantile(selected_col, probs = seq(0, 1, by = 0.25), na.rm = TRUE)
quantiles_str <- paste(round(quantiles, 2), collapse = ", ")
textInput("quantiles_text", label = paste("Quantiles of", input$char_column_selector), value = quantiles_str)
}
}
})
grouped_data <- reactive({
data <- filtered_data()
if (input$char_column_selector == "") {
data %>%
group_by(date) %>%
summarise(principal_mean = mean(principal, na.rm = TRUE)) %>%
mutate(date = as.Date(date))
} else {
selected_col <- input$char_column_selector
if (is.numeric(data[[selected_col]])) {
req(input$quantiles_text)
quantiles <- as.numeric(strsplit(input$quantiles_text, ",\s*")[[1]])
data <- data %>% mutate(char = cut(data[[selected_col]], breaks = quantiles, include.lowest = TRUE))
data %>%
group_by(date, char) %>%
summarise(principal_mean = mean(principal, na.rm = TRUE)) %>%
arrange(date) %>%
mutate(date = as.Date(date))
} else {
data %>%
group_by(date, char = .data[[selected_col]]) %>%
summarise(principal_mean = mean(principal, na.rm = TRUE)) %>%
arrange(date) %>%
mutate(date = as.Date(date))
}
}
})
output$table <- renderTable({
req(data_loaded())
grouped_data()
})
output$plot <- renderPlotly({
req(data_loaded())
data <- grouped_data()
if (input$char_column_selector == "") {
plot_ly(data, x = ~date, y = ~principal_mean, type = 'scatter', mode = 'lines+markers')
} else {
plot_ly(data, x = ~date, y = ~principal_mean, type = 'scatter', mode = 'lines+markers', color = ~char)
}
})
}
shinyApp(ui = ui, server = server)