我有我認爲是一個非常簡單的用戶案例,我一直無法找到解決方案:我希望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,我的示例代碼的行爲就像下面的答案所表明的那樣,並且提供的解決方案可以工作。 –