使用条件selectInput动态生成更多selectInputs的RenderUI

使用条件selectInput动态生成更多selectInputs的RenderUI,r,shiny,R,Shiny,我正试图通过以下方式构建一个闪亮的界面: 主选择器,决定: 显示哪个子菜单(输入),哪个决定: 要显示多少后续输入 这是一个最小的可重复的例子 如果从主选择器中选择“First”,则存在一个具有两种可能性[1,2]的子菜单。这些可能性导致生成1或2个后续输入。因此,这些可能性: 如果从主选择器中选择“秒”,则存在一个具有两种可能性[3,4]的子菜单。这些可能性导致生成3或4个后续输入 ui我不确定这是否是你想要的。主要问题是函数build\u inputs不返回任何内容。第二个问题是sele

我正试图通过以下方式构建一个闪亮的界面:

  • 主选择器,决定:
  • 显示哪个子菜单(输入),哪个决定:
  • 要显示多少后续输入
  • 这是一个最小的可重复的例子

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

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


    ui我不确定这是否是你想要的。主要问题是函数
    build\u inputs
    不返回任何内容。第二个问题是
    selectInput
    中的选项不是数字,因此需要事先转换它们。与您提到的错误相关的另一个小问题是,您要渲染的元素同时存在,因此在
    input$first_子菜单
    上设置一个条件将触发错误(即使它在几毫秒内为
    NULL
    ),因此(几乎总是)处理可能为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)
    
    ui
    
    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)