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