【发布时间】:2018-03-01 23:10:52
【问题描述】:
我想在 Shiny 中创建一个动态 UI,每次单击按钮时,都会创建一个带有多个输入字段的新 UI 元素。我希望我可以使用 reactiveValues 来做到这一点,但是 ui 代码无法访问它们,所以我无法告诉它要显示多少元素。
这是一个可重现的示例,每次单击时只创建一个 UI 字段 - 它适用于按钮的前两次单击,但由于 ui 部分中的 lapply 被编码为固定值(本例中为 3),之后,新的不再显示。我知道我可以将 ui 值设置为更高的数字,但我希望它具有反应性。 (在完整版中,我希望在每个元素中都有以相同方式工作的嵌套元素,以及删除每个字段的按钮。)
server <- function(input, output) {
rv <- reactiveValues(numFields = 1)
#
# start with one input box
#
output$textUI1 <- renderUI(textInput("textInput1", "Input #1"))
#
# each time the button is clicked, increase the reactive value
#
observeEvent(input$addField, rv$numFields <- rv$numFields + 1)
#
# render any additional UI input fields according to value of rv$numFields
#
observe({
if(rv$numFields > 1)
{
lapply(2:rv$numFields, function(i) {
output[[paste0("textUI", i)]] <- renderUI({
textInput(paste0("textInput", i), paste0("Input #", i))
})
})
}
})
}
ui <- fluidPage(sidebarLayout(
sidebarPanel(
actionButton("addField", "Add text input box")
),
mainPanel(
# UI output
lapply(1:3, function(i) { # instead of 3 I want something like rv$numFields here
uiOutput(paste0("textUI", i))
})
)
))
shinyApp(ui, server)
【问题讨论】: