I have a shiny app. I am having trouble displaying the output of multiple csv files in the main panel of the raw data tab. This is my workflow:
- Enable the user to select how many groups of datasets to input (done).
- Enables the user to select multiple CSV files for each group. E.g. If I have selected 3 in step 1, three fileInput boxes appear to enter the files. (done)
- Rbind the files selected for each group. (help!)
- Display the rbinded datasets in a new tab (raw data) for each independent group. (help!) The data that is being inputted by the user has the same exact columns.
I'm sure it is a simple solution, I just can't get it working. This is the basis of my code
ui <- fluidPage(
theme = bs_theme(version = 4, bootswatch = "pulse"),
# Application title
titlePanel(HTML("<center>Analysis</center>")),
sidebarLayout(
sidebarPanel(
#begin tab
conditionalPanel(condition = "input.tabselected==3", numericInput(
"group_num",
"How many independent variables are you comparing",
2,
min = 1,
max = 20
),
uiOutput("groups"),
actionButton("save_btn", "Save Variables"),
uiOutput("files")),
actionButton("save_files", "Save Files"),
),
mainPanel(
tabsetPanel(type = "tabs", id = "tabselected", selected = 3, #Default tab selected is 3
tabPanel("Begin", textOutput("text1"), verbatimTextOutput("saved_variables"), value = 3),
tabPanel("Raw Data", tableOutput("raw_data")),
tabPanel("Stats", textOutput("stats_choice")),
tabPanel("Data", tableOutput("out_data")),
)
)
)
)
server <- function(input, output) {
# Generate dynamic text input fields based on the number of groups
output$groups <- renderUI({
group_num <- as.integer(input$group_num)
lapply(
1:group_num,
function(i){
textInput(
paste0("group", i),
paste0("Enter the name of group ", i)
)
}
)
})
# Generate dynamic file input fields based on the number of groups
output$files <- renderUI({
group_num <- as.integer(input$group_num)
lapply(
1:group_num,
function(i){
fileInput(
paste0("file", i),
paste0(
"Select the .csv file for group ", i),
multiple = TRUE,
accept= ".csv"
)
}
)
})
# Save the text inputs as variables when the button is clicked
saved_variables <- reactiveValues()
observeEvent(input$save_btn, {
group_num <- as.integer(input$group_num)
saved_variables$names <- sapply(1:group_num, function(i) input[[paste0("group", i)]])
})
# Generate the output text
output$text1 <- renderText({
if (is.null(input$group_num)) {
return()
}
group_num <- as.integer(input$group_num)
variables <- saved_variables$names
paste0(
"You are comparing ", group_num, " independent variables. ",
"The groups are called ", paste(variables, collapse = ", "), "."
)
})
# Display the saved variables
output$saved_variables <- renderPrint({
req(saved_variables$names)
saved_variables$names
})
output$stats_choice <- renderText({paste0("test4")})
output$out_data <- renderText({paste0("test5")})
}
# Run the application
shinyApp(ui = ui, server = server)