为动态添加的selectInput注册事件处理程序

时间:2017-04-20 22:24:12

标签: r shiny

我目前正致力于使用R Shiny构建的Web应用程序,该应用程序的功能基于动态创建的UI,包括呈现其他输入字段,即selectInputinputId的{​​{1}}属性也是动态创建的,我无法预定义创建的selectInputs的数量,因为它也会根据用户的输入而变化。

当我想对用户更改动态创建的selectInputs中的选定值时,会出现问题。通常,如果selectInput是"静态",我会用observeEvent注册它:

selectInput

但是,我无法预先为未知数量的未指定observeEvent(input$select_inputId, { ... }) 注册事件。是否有可能将某种事件处理程序传递给inputIds或其他解决此问题的方法?

以下是动态创建UI的代码的基本部分:

selectInput

编辑:您可以在下面找到Shiny App的可重现示例。解决方案是存储用户在注释的observeEvent(input$rate_criterion_select, { output$rate_criterions_ratios <- renderUI({ container <- tags$div() for(i in seq(1, length(children_criterions))) { container <- tagAppendChild(container, selectInput( inputId = paste(input$rate_criterion_select, i) label = "" choices = rates ) } return(container) }) }) 变量中提供的值。例如:如果用户选择3个输入来填充并相应地选择&#34;一个&#34;,&#34;两个&#34;和&#34;三&#34;,choices应该是一个向量choices;如果用户选择2个输入来填充和选择&#34; 2&#34;,&#34; 2&#34; - c("One","Two","Three")应为choices

server.R

c("Two","Two")

ui.R

library(shiny)

# choices <- 

shinyServer(function(input, output) {

  observeEvent(input$how_many, {
    output$render_area <- renderUI({
      container <- tags$div()
      for(i in seq(1, as.numeric(input$how_many))) {
        container <- tagAppendChild(container, selectInput(
          inputId = paste("selection", i),
          label = paste("Selection", i),
          choices = c("One", "Two", "Three"),
          selected = "One"
        ))
      }

      return(container)
    })
  })

})

1 个答案:

答案 0 :(得分:1)

这不是你问题的答案,但我可以在你的代码中看到一些不应该做的奇怪事情。这是对您的代码的重写,我建议您将其作为起点:

ui <- fluidPage(
  titlePanel("Example App"),

  sidebarLayout(
    sidebarPanel(
      numericInput("how_many", "How many inputs do you want to fill?", 1, 1, 5)
    ),

    mainPanel(
      uiOutput("render_area")
    )
  )
)

server <-function(input, output) {

  output$render_area <- renderUI({
    lapply(seq(input$how_many), function(i) {
      selectInput(
        inputId = paste("selection", i),
        label = paste("Selection", i),
        choices = c("One", "Two", "Three")
      )
    })
  })

}

shinyApp(ui,server)
  • 只需使用numericInput()
  • ,而不是包含数字然后必须将它们转换为整数的选择下拉列表
  • 您可以使用lapplt()创建并返回多个选择下拉列表,而不是使用for循环和tagAppendChild() - 这是过度杀伤
  • 您不应在output$render_area的观察者内部定义input$how_manyoutput$render_area应该是顶级的。我建议阅读一些关于反应性的资源,因为这段代码意味着对反应性的误解(这是一个难题!)

同样,这并没有回答你的问题,但我希望它能帮助你将来所有闪亮的代码。