Tôi có một trường hợp người dùng khá đơn giản mà tôi không thể tìm được giải pháp cho: Tôi muốn Sáng tạo để tạo số lượng đầu vào do người dùng chỉ định, tự động tạo người quan sát cho mỗi người.Tạo các nhà quan sát cho số đầu vào động
Trong mã có thể tái sản xuất tối thiểu bên dưới, người dùng cho biết số lượng nút tác vụ mong muốn bằng cách nhập vào tiện ích textInput
; sau đó anh ta nhấn "submit", tạo ra các nút hành động.
Những gì tôi muốn là cho người sử dụng để sau đó có thể nhấp vào bất kỳ nút hành động và tạo ra một sản lượng cụ thể cho nó (ví dụ như đối với trường hợp tối thiểu, chỉ in tên của nút):
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)
Vấn đề với mã ở trên là bằng cách nào đó một số nhà quan sát được tạo ra, nhưng tất cả họ đều lấy làm đầu vào của họ chỉ mục cuối cùng trong danh sách được chuyển đến lapply
. Vì vậy, nếu tôi tạo ra bốn nút hành động, và tôi bấm vào nút hành động # 4, Shiny in tên của nó bốn lần, trong khi tất cả các nút khác không phản ứng.
Ý tưởng để tạo ra các quan sát viên sử dụng lapply
đến từ https://github.com/rstudio/shiny/issues/167#issuecomment-152598096
Đây chỉ là một lưu ý rằng vấn đề tạo ra các quan sát viên chỉ dành cho mục cuối cùng trong danh sách quá khứ để 'lapply' là một trong những khả năng tương thích giữa Shiny và phiên bản của R mà tôi đã cài đặt. Với phiên bản mới nhất của R, mã ví dụ của tôi hoạt động giống như câu trả lời dưới đây cho biết, và giải pháp được cung cấp có hiệu quả. –