Hello, I need help of how to convert a list of reactive values from dynamic UI input into a dataframe. I have tried unlist() and unest() but non worked.
This is how I group the reactive values from the ui input together.
return(c(reactive({input$FilmProducer}),
reactive({input$Series}),
reactive({input$Episode})
))
}
And here is how I read it and render it as text (which works)
ui <- fluidPage(
div(id="placeholder"),
actionButton("submit", "Add Selection:"),
verbatimTextOutput("out")
)
server <- function(input, output, session) {
handler <- reactiveVal(list())
observeEvent(input$submit, {
new_id <- paste("row", input$submit, sep = "_")
insertUI(
selector = "#placeholder",
where = "beforeBegin",
ui = row_ui(new_id)
)
handler_list <- isolate(handler())
new_handler <- callModule(row_server, new_id)
handler_list <- c(handler_list, new_handler)
names(handler_list)[length(handler_list)] <- new_id
handler(handler_list)
})
output$out <- renderPrint({
lapply(handler(), function(handle) {
handle()
})
})
}
However I cannot convert this list into a dataframe and render as table output. Please help.
I included the full code below.
My input
structure(list(FilmProducer = c("Amazon Prime Video", "Amazon Prime Video",
"Amazon Prime Video", "Amazon Prime Video", "Amazon Prime Video",
"Amazon Prime Video", "Amazon Prime Video", "Amazon Prime Video",
"The Walt Disney Company", "The Walt Disney Company", "The Walt Disney Company",
"The Walt Disney Company", "The Walt Disney Company"), Series = c("Mirzapur",
"Mirzapur", "Mirzapur", "Mirzapur", "The Boys", "The Boys", "The Boys",
"The Boys", "AndiMack", "AndiMack", "Lizzie McGuire", "Lizzie McGuire",
"Lizzie McGuire"), Episode = c("Ep 1", "Ep 2", "Ep 3", "Ep 4",
"Ep 1", "Ep 2", "Ep 3", "Ep 4", "Ep 1", "Ep 2", "Ep 1", "Ep 2",
"Ep 3")), class = "data.frame", row.names = c("1", "2", "3",
"4", "5", "6", "7", "8", "9", "10", "11", "12", "13"))
My code:
library(tidyr)
library(shiny)
library(dplyr)
row_ui <- function(id) {
ns <- NS(id)
fluidRow(
column(2, textInput(ns("SelectionID"), label = "Enter the name of your selection:")),
column(2, uiOutput(ns("FilmProducer"))),
column(2, uiOutput(ns("Series"))),
column(2, uiOutput(ns("Episode")))
)
}
setwd("~")
getwd()
FilmOption <- read.csv("~SampleforStackOverflow.csv", header=T, encoding = "UTF-8")
FilmOption <- rename(FilmOption,"FilmProducer" = "X.U.FEFF.FilmProducer")
row_server <- function(input, output, session) {
output$FilmProducer <- renderUI({
ns <- session$ns
type <- req(input$SelectionID)
if(!is.null(type)) {
selectInput(ns("FilmProducer"),"Choose the Film Producer:",choices = c("Amazon Prime Video","The Walt Disney Company"), selected = NULL)
}
})
output$Series <- renderUI({
ns <- session$ns
type <- req(input$SelectionID)
if(!is.null(type)) {
selectInput(ns("Series"),"Choose the Series name:",choices = NULL, multiple = TRUE, selected = NULL)
}
}
)
observeEvent(input$FilmProducer, {
ProducerList <- FilmOption %>%
filter(FilmProducer == input$FilmProducer) %>%
select(Series) %>% distinct() %>% arrange(Series)
ProducerList <- rbind(ProducerList,"")
ProducerList[2:nrow(ProducerList),] <- ProducerList[1:(nrow(ProducerList)-1),]
ProducerList[1,] <- "Select All"
if (nrow(ProducerList) == 1) {
updateSelectInput(session, "Series","Choose the Series name:",
choices = as.character(ProducerList))
}
else {updateSelectInput(session, "Series","Choose the Series name:",
choices = ProducerList)}
})
observeEvent(input$Series,{
if("Select All" %in% input$Series) {
ProducerList <- FilmOption %>%
filter(FilmProducer == input$FilmProducer) %>%
select(Series) %>% distinct() %>% arrange(Series)
ProducerList <- rbind(ProducerList,"")
ProducerList[2:nrow(ProducerList),] <- ProducerList[1:(nrow(ProducerList)-1),]
ProducerList[1,] <- "Select All"
selected_choices= ProducerList[-1,]}
else
selected_choices=input$Series
updateSelectInput(session, "Series", "Choose the Series name:", selected = selected_choices)
})
output$Episode <- renderUI({
ns <- session$ns
type <- req(input$SelectionID)
if(!is.null(type)) {
selectInput(ns("Episode"),"Choose the Episode:",choices = NULL, multiple = TRUE, selected = NULL)
}
})
observeEvent(input$Series, {
SeriesList <- FilmOption %>%
filter(FilmProducer == input$FilmProducer) %>%
filter(Series == input$Series) %>%
select(Episode) %>% distinct() %>% arrange(Episode)
SeriesList <- rbind(SeriesList,"")
SeriesList[2:nrow(SeriesList),] <- SeriesList[1:(nrow(SeriesList)-1),]
SeriesList[1,] <- "Select All"
if (nrow(SeriesList) == 1) {
updateSelectInput(session, "Episode","Choose the Episode:",
choices = as.character(SeriesList))
}
else {updateSelectInput(session, "Episode","Choose the Episode:",
choices = SeriesList)}
})
observeEvent(input$Episode, {
SeriesList <- FilmOption %>%
filter(FilmProducer == input$FilmProducer) %>%
filter(Series == input$Series) %>%
select(Episode) %>% distinct() %>% arrange(Episode)
SeriesList <- rbind(SeriesList,"")
SeriesList[2:nrow(SeriesList),] <- SeriesList[1:(nrow(SeriesList)-1),]
SeriesList[1,] <- "Select All"
if("Select All" %in% input$Episode) {
selected_choices= SeriesList[-1,]}
else
selected_choices=input$Episode
updateSelectInput(session, "Episode", "Choose the Episode:", selected = selected_choices)
})
return(c(reactive({input$FilmProducer}),
reactive({input$Series}),
reactive({input$Episode})
))
}
ui <- fluidPage(
div(id="placeholder"),
actionButton("submit", "Add Selection:"),
verbatimTextOutput("out")
)
server <- function(input, output, session) {
handler <- reactiveVal(list())
observeEvent(input$submit, {
new_id <- paste("row", input$submit, sep = "_")
insertUI(
selector = "#placeholder",
where = "beforeBegin",
ui = row_ui(new_id)
)
handler_list <- isolate(handler())
new_handler <- callModule(row_server, new_id)
handler_list <- c(handler_list, new_handler)
names(handler_list)[length(handler_list)] <- new_id
handler(handler_list)
})
output$out <- renderPrint({
lapply(handler(), function(handle) {
handle()
})
})
}
shinyApp(ui, server)