如何在Shiny中获取动态生成的textin输入框的有序值?
解决Shiny动态TextInput组件的取值问题
你当前的问题在于获取输入值时包含了add_btn/rm_btn的点击计数,且结果顺序混乱。要只获取按输入框顺序排列的textin系列输入值,可通过以下方式修改代码:
核心解决方案
利用输入框的计数变量counter$n,按编号顺序提取目标输入值,或从全量输入中筛选并排序textin相关项,确保结果仅包含所需内容且顺序正确。
修改后完整代码
library(shiny) ui <- shinyUI(fluidPage( sidebarPanel( actionButton("add_btn", "Add Textbox"), actionButton("rm_btn", "Remove Textbox"), textOutput("counter"), verbatimTextOutput("my_inputs") ), mainPanel(uiOutput("textbox_ui")) )) server <- shinyServer(function(input, output, session) { # 跟踪输入框数量 counter <- reactiveValues(n = 0) observeEvent(input$add_btn, {counter$n <- counter$n + 1}) observeEvent(input$rm_btn, { if (counter$n > 0) counter$n <- counter$n - 1 }) output$counter <- renderPrint(print(counter$n)) # 生成动态TextInput(移除冗余的value绑定,Shiny自动保留输入状态) textboxes <- reactive({ n <- counter$n if (n > 0) { lapply(seq_len(n), function(i) { textInput(inputId = paste0("textin", i), label = paste0("Textbox", i)) }) } }) output$textbox_ui <- renderUI({ textboxes() }) # 按顺序提取textin输入值 targetInputs <- reactive({ req(counter$n > 0) sapply(seq_len(counter$n), function(i) { # 处理未输入的情况,返回空字符串避免NULL值 input[[paste0("textin", i)]] %||% "" }) }) output$my_inputs <- renderPrint({ targetInputs() }) }) shinyApp(ui, server)
备选筛选方案(从全量输入中提取)
若需要从所有输入中筛选目标项,可替换targetInputs部分为以下代码:
targetInputs <- reactive({ all_inputs <- reactiveValuesToList(input) # 筛选以textin开头的输入ID textin_ids <- grep("^textin\\d+$", names(all_inputs), value = TRUE) # 按编号排序ID sorted_ids <- textin_ids[order(as.integer(sub("textin", "", textin_ids)))] # 提取对应值 unlist(all_inputs[sorted_ids]) })
关键说明
- 原代码中通过
AllInputs()绑定textInput的value是冗余操作,Shiny会自动保留动态生成控件的输入状态,无需手动设置。 - 两种方案都能确保输出结果仅包含按顺序排列的
textin输入值,不会混入按钮计数等无关内容。
内容的提问来源于stack exchange,提问作者Taufiq Rochman
相关产品推荐
相关产品推荐

