在 R Shiny 中,当使用 renderUI/uiOutput 动态生成控件集时,如何通过引发事件来获取这些值或填充输入?

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?

问题 在 R Shiny 中,当使用

动态生成控件集,例如:

如何通过引发事件来获取这些值或填充输入?

按原样,那些生成的控件似乎是“仅显示”。创建一个 selection、标记一个复选框或输入数据只会更新显示,但不会创建任何事件,并且不会将值填充到“输入”变量 ( ReactiveValues ) 中;因此,闪亮的服务器进程没有收到任何东西。

如果这些控制输入实际上是隔离的,则完全破坏了动态创建控件的意义。

显然,我希望这个问题已经得到解决,但我的搜索没有找到它。

在我的具体案例中,UI 允许用户:

  1. Select 并上传 CSV 文件。
  2. 该逻辑识别数值列、日期列和分组列,并生成 3 组单选按钮控件集。这个想法是您选择您感兴趣的列。
  3. 选择一个分组列应该return columnID 返回到服务器,在那里它会显示一个离散的组列表,select。这失败了,因为 select 离子不会生成事件,并且输入变量(提供给 server.R)仅包含来自静态控件的 ReactiveValues。

也就是说,控件的显示看起来不错。


Step#0 screenshot:

Step#1 screenshot:


在 server.R 方面,我使用如下代码创建单选按钮。

    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
    })

我试过使用提交按钮和操作按钮来尝试强制执行事件,但没有骰子。我的头骨风暴现在会转到诸如“我需要以某种方式在这里使用 Javascript 吗?”

之类的地方

非常感谢所有在这件事上借给我周期的人。

我不确定我是否理解你的问题。这是一个 MWE,它访问由 uiOutput/renderUI 创建的小部件的值。 uiOutput/renderUI创建的小部件的值可以像访问任何其他小部件的值一样访问。

如果这不能满足您的需求,请提供更多详细信息。

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)