【问题标题】:RenderUI with conditional selectInput that dynamically builds more selectInputs in Shiny使用条件 selectInput 渲染 UI,在 Shiny 中动态构建更多 selectInputs
【发布时间】:2018-04-17 17:53:57
【问题描述】:

我正在尝试构建一个闪亮的界面:

  1. 一个主选择器,它决定:
  2. 显示哪个子菜单(输入),由哪个决定:
  3. 要显示多少后续输入

这是一个可重现的最小示例。

如果从主选择器中选择“First”,则存在具有两种可能性 [1,2] 的子菜单。这些可能性导致构建 1 或 2 个后续输入。所以这些可能性:

如果从主选择器中选择“第二”,则存在具有两种可能性 [3,4] 的子菜单。这些可能性会导致构建 3 或 4 个后续输入。

ui <- fluidPage(
  radioButtons(inputId="main_selector",label=h5('Select menu'),
               choices = list('First','Second'),selected='First'),
  uiOutput("ui_selected")
)

server <- function(input, output, session) {

  build_inputs <- function(choices){
    output = tagList()
    for(i in 1:choices){
      output[[i]] = tagList()
      output[[i]][[1]] = numericInput(inputId =  paste0(i),
                                      label =  paste0(i),
                                      value = i)
    }
  }

# Are these reactive elements necessary? Should they be in the renderUI below?
  first_submenu <- reactive({
    input$first_submenu
  })
  second_submenu <- reactive({
    input$second_submenu
  })

  output$ui_selected <- renderUI({

    if (input$main_selector == 'First'){
    selectInput(inputId = "first_submenu", label="First submenu",
                choices=list(1,2))

      choices_1 <- first_submenu()
      # Build a list of inputs dependent on the choice above
      output <- build_inputs(choices_1)

    } else if (input$main_selector == 'Second'){
      selectInput(inputId = "second_submenu", label="Second submenu",
                  choices=list(3,4))

      choices_2 <- second_submenu()
      # Build a list of inputs dependent on the choice above
      output <- build_inputs(choices_2)

    # Return output as output$ui_selected element 
    output
  })
}

shinyApp(ui, server)

我收到的错误是警告:长度为 0 的 :: 参数中的错误。我相信这是因为您无法从 renderUI 元素调用 first_submenu 的结果 - 但我不知道如何正确构建我的代码。

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    我不确定这是否是您所追求的。主要问题是您的函数build_inputs 不返回任何内容。第二个问题是来自selectInput 的选项不是数字,因此您需要事先转换它们。另一个与您提到的错误相关的小问题是您要渲染的元素同时存在,因此在input$first_submenu 上设置条件将触发错误(即使是NULL 几个毫秒),因此(几乎总是)处理可能为空的输入是一种好习惯。我做的最后一件事是为最后一层动态输入添加另一个uiOutput。希望这会有所帮助。

    ui <- fluidPage(
      radioButtons(inputId="main_selector",label=h5('Select menu'),
                   choices = list('First','Second'),selected='First'),
      uiOutput("ui_selected"),
      uiOutput("ui_numeric_inputs")
    )
    
    server <- function(input, output, session) {
    
      build_inputs <- function(choices) {
        output = tagList()
        for(i in 1:choices){
          output[[i]] = tagList()
          output[[i]][[1]] = numericInput(inputId =  paste0(i),
                                          label =  paste0(i),
                                          value = i)
        }
        return(output)
      }
    
      output$ui_selected <- renderUI({
    
        if (input$main_selector == 'First'){
          selectInput(inputId = "first_submenu", label="First submenu",
                      choices=c(1,2))
        } else if (input$main_selector == 'Second'){
          selectInput(inputId = "second_submenu", label="Second submenu",
                      choices=list(3,4))
        }
      })
    
      output$ui_numeric_inputs <- renderUI({
        if (input$main_selector == 'First' && 
    (!is.null(input$first_submenu))) {
          build_inputs(as.numeric(input$first_submenu))
        } else if (input$main_selector == 'Second' && 
    (!is.null(input$second_submenu))){
          build_inputs(as.numeric(input$second_submenu))
        }
      })
    }
    
    shinyApp(ui, server)
    

    【讨论】:

      猜你喜欢
      • 2018-07-08
      • 2019-12-27
      • 2020-07-26
      • 1970-01-01
      • 2014-07-04
      • 2018-02-24
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      相关资源
      最近更新 更多