使用 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
代替循环
我想收集用户输入,并在 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
代替循环