rdynamicshinycontrolsrenderui

In R Shiny, when using renderUI/uiOutput to dynamically generate sets of controls, how can I harvest those values or populate input by causing events?


Question In R Shiny, when using

to dynamically generate sets of controls, such as:

how can I harvest those values or populate input by causing events?

As-is, those generated controls appear to be "display only". Making a selection, marking a checkbox, or entering data only updates the display, but no Event is created and the values are not populated into the "input" variable ( ReactiveValues ); thus, nothing is received by the Shiny server process.

If these control inputs are in-fact isolated, it completely undermines the point of dynamically creating controls.

Obviously, I'm hoping that this issue has been addressed, but my searches haven't turned it up.

In my specific case, the UI allows the user to:

  1. Select and upload a CSV file.
  2. The logic identifies numerical, date, and grouping columns, and produces 3 sets of radiobutton control sets. The idea is that you pick which columns you are interested in.
  3. Picking a grouping column SHOULD return that columnID back to the server, where it will display a discrete list of groups from which to select. This fails, as the selections do not generate an Event, and the input variable (provided to server.R) only contains the ReactiveValues from the static controls.

That said, the display of the controls looks fine.


Step#0 screenshot:

Step#1 screenshot:


On the server.R side, I'm using code as below to create the radioButtons.

    output$radioChoices <- reactive({
...
        inputGroup <- renderUI({
        input_list <- tagList(
           radioButtons(inputId = "choiceGrp", label = "Available Grouping Columns", choices = grpColumnNames,  inline = TRUE, selected = selectedGrp),
           radioButtons(inputId = "choiceNumb",label = "Available Numerical Columns",choices = numColumnNames,  inline = TRUE, selected = selectedNum),
           radioButtons(inputId = "choiceDate",label = "Available Date Columns",     choices = dateColumnNames, inline = TRUE, selected = selectedDate),
           hr()
        )
        do.call(tagList, input_list)
      })
      print(inputGroup)
      output$radioChoices <- inputGroup
    })

I have played around with a Submit button and ActionButtons to try and force an Event, but no dice. My skull-storming is now going to places like "do I need to somehow use Javascript here?"

Many thanks to all of you who are lending me your cycles on this matter.


Solution

  • I'm not sure I understand your problem. Here's a MWE that accesses the value of a widget created by uiOutput/renderUI. The values of widgets created by uiOutput/renderUIcan be accessed just like those of any other widget.

    If this doesn't give you what you want, please provide more details.

    library(shiny)
    
    ui <-
      fluidPage(
        uiOutput("dataInput"),
        textOutput("result")
      )
    
    server <- function(input, output, session) {
      output$dataInput <- renderUI({
        selectInput("beatles", "Who's your favourite Beatle?", choices=c("- Select one -"="", "John", "Paul", "George", "Ringo"))
      })
      
      output$result <- renderText({
        req(input$beatles)
        
        paste0("You chose ", input$beatles)
      })
    }
    
    shinyApp(ui, server)