使用 R Shiny 收集当前用户输入和 ignore/remove 之前的输入

Collect current user inputs and ignore/remove the previous inputs using R Shiny

我想收集用户输入,并在 Shiny 中将它们输出为 table/data 框架。受 post 这里 (Collect All user inputs throughout the Shiny App) 的启发,我能够做到这一点,但存在以下一些问题。这里我附上了示例代码,我打算在其中使用反应式文本输入框收集用户输入。 textInput 框的数量取决于用户输入的“框数”。当我不断增加“框数”时,输出 table 看起来不错,例如我将框数从 1 增加到 2(请参见所附屏幕截图 1 和 2)。但是,当我将框数从 2 改回 1 时,输出 table 仍然显示之前的结果“textBox2 the second input”(参见屏幕截图 3)。我的问题是如何删除之前的输入(“textBox2 第二个输入”)并仅打印出当前用户输入。谢谢!

示例代码

library(shiny)
ui <- basicPage(
  fluidRow(column(6,
           numericInput("nbox", "Number of box", value = 1, 
                        min = 1))),
  fluidRow(column(6,style='padding:0px;',
                  wellPanel(
                    uiOutput("textInputBox"))), 
           column(6, style='padding:0px;',
                  tableOutput('show_inputs')))
)

server <- shinyServer(function(input, output, session){
  
  output$textInputBox <- renderUI({
    num <- as.integer(input$nbox)
    lapply(1:num, function(i) {
      textInput(paste0("textBox", i),
                label = paste0("textBox", i))
      })
    })

  AllInputs <- reactive({
    myvalues <- NULL
    for(i in 1:length(names(input))){
      myvalues <- as.data.frame(rbind(myvalues,
                                      (cbind(names(input)[i],input[[names(input)[i]]]))))
    }
    names(myvalues) <- c("User input variable","User input value")
    myvalues
  })
  
  output$show_inputs <- renderTable({
    AllInputs()
    })
  
})
shinyApp(ui = ui, server = server)

屏幕截图(依次为 1、2、3)

创建的输入在调用新的renderUI时不会被删除,所以没有这种方法可以解决。

一种解决方法是使用一个计数器(就像以前用来创建输入的那个)并用它来重建名称:

AllInputs <- reactive({
    num <- as.integer( input$nbox )
    my_names <- paste0("textBox", 1:num)
    all_values <- stack( reactiveValuesToList(input) )
    myvalues <- all_values[ all_values$ind %in% c("nbox", my_names), 
                            c(2, 1)]
    names(myvalues) <- c("User input variable","User input value")
    myvalues
})

注意使用reactiveValuesToList代替循环