【发布时间】:2016-12-21 09:52:06
【问题描述】:
我有一个我认为非常简单的用户案例,但我无法找到解决方案:我希望 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”的问题是 Shiny 和我安装的 R 版本之间的兼容性之一。使用最新版本的 R,我的示例代码的行为就像下面的答案所说的那样,并且提供的解决方案有效。