I am trying to use a module that creates a UI containing an "Add" button that, once clicked, generates two pickerInputs
. The first pickerInput
allows to select a column name from a dataframe (the diamonds
dataset here), whereas the second pickerInput
should displays the unique values of the column previously selected. The user should also be able to click several times the button in order to select more columns and variables.
I am facing 2 issues:
(i) although I can generate the first pair of pickerInput
with the correct values to choose from, the second time I click the button there are no choices on the second pickerInput
.
(ii) I cannot manage to return the values selected to the app, and thus cannot subset the original dataset.
Any help and explanations would be greatly appreciated.
library(shiny)
library(shinyWidgets)
### MODULE ###
myModule.UI <- function(id){
ns <- NS(id)
actionButton(inputId = ns("add"), label = "Add")
}
myModule.SERVER <- function(input, output, session, data, columns){
ns <- session$ns
module_out <- reactiveValues(var=NULL, val=NULL)
observeEvent(input$add, {
insertUI(
selector = paste0("#", ns("add")),
where = "beforeBegin",
ui = fluidRow(
column(width = 5,
pickerInput(inputId = ns("myVariable"),
choices = columns,
selected = NULL
)
),
column(width = 5,
pickerInput(inputId = ns("myValue"),
choices = NULL,
selected = NULL,
options = list(`actions-box` = TRUE),
multiple = TRUE
)
)
)
)
})
observeEvent(input$myVariable,{
req(input$myVariable)
var_choices <- reactive({
as.character(unlist(unique(data[, input$myVariable])))
})
updatePickerInput(session,
inputId = "myValue",
choices = var_choices(),
selected = NULL,
choicesOpt = list(`actions-box` = TRUE)
)
module_out <- reactiveValues(var = input$myVariable, val = input$myValue)
})
return(module_out)
}
### APP ###
ui <- fluidPage(
mainPanel(
myModule.UI(id = "myID"),
tableOutput("table_out")
)
)
server <- function(input, output, session) {
output_data <- callModule(module=myModule.SERVER, id="myID", data = diamonds, columns = colnames(diamonds)[2:4])
# subset table here
output$table_out <- renderTable({
# I dont know how `output_data` will look like...
})
}
shinyApp(ui = ui, server = server)