我有我认为是一个非常简单的用户案例,我一直无法找到解决方案:我希望Shiny生成用户指定数量的输入,动态创建每个观察员。生成动态输入数量的观察者
在下面的最小可重现代码中,用户通过键入textInput
小部件来指示所需的动作按钮数量;他或她然后按下“提交”,这会产生动作按钮。
我要的是为用户则可以点击任何动作按钮并生成特定的输出到它(例如用于最小的情况下,只打印按钮的名称):
library("shiny")
ui <- fluidPage(textInput("numButtons", "Number of buttons to generate"),
actionButton("go", "Submit"), uiOutput("ui"))
server <- function(input, output) {
makeObservers <- reactive({
lapply(1:(as.numeric(input$numButtons)), function (x) {
observeEvent(input[[paste0("add_", x)]], {
print(paste0("add_", x))
})
})
})
observeEvent(input$go, {
output$ui <- renderUI({
num <- as.numeric(isolate(input$numButtons))
rows <- lapply(1:num, function (x) {
actionButton(inputId = paste0("add_", x),
label = paste0("add_", x))
})
do.call(fluidRow, rows)
})
makeObservers()
})
}
shinyApp(ui, server)
上面的代码的问题是,不知何故创建了几个观察者,但它们都只将其传递给lapply
的列表中的最后一项作为它们的输入。因此,如果我生成四个动作按钮,并且点击动作按钮#4,则Shiny会打印其名称四次,而其他所有按钮都不会作出反应。
的想法使用lapply
来自https://github.com/rstudio/shiny/issues/167#issuecomment-152598096
这只是一张纸条,只有列表中的过去“lapply”的最后一个项目产生观察员的问题是闪亮之间的兼容性和R版本我已经安装了。使用最新版本的R,我的示例代码的行为就像下面的答案所表明的那样,并且提供的解决方案可以工作。 –