При нажатии кнопки действия один раз моё выражение наблюдаем в два раза.
В частности, при выполнении приведенного ниже кода, если нажать кнопку «Добавить элемент», а затем нажать первую кнопку «Удалить», сообщение «удаленный 1» будет напечатано дважды. Это минимальный пример поведения, которое я изначально наблюдал в более сложном контексте.
(В этом более сложном примере поведение запуска несколько раз проявлялось как все элементы, удаляемые при нажатии одной кнопки удаления. Я определил, что это произошло потому, что логика удаления для удаления элемента с определенным индексом выполнялась несколько раз раз.)
library(plyr)
library(shiny)
ui <- fluidPage(
actionButton("addItem", "Add Item"),
uiOutput("items")
)
server <- function(input, output, session) {
itemsReactive <- reactiveVal(list(Item1 = "foo"))
observeEvent(input$addItem, {
itemsReactive(c(itemsReactive(), list(Item2 = "foo")))
})
output$items <- renderUI({
splat(div)(
unname(mapply(function(item, index) {
deleteButtonId <- paste('delete-button', index, sep = '-')
observer <- observeEvent(input[[deleteButtonId]], {
print(paste("deleted", index))
observer$destroy()
}, once = TRUE)
div(actionButton(deleteButtonId, "Delete"))
}, itemsReactive(), seq_along(itemsReactive()), SIMPLIFY = FALSE))
)
})
}
shinyApp(ui = ui, server = server)
Почему оператор print выполняется более одного раза, когда кнопка удаления нажимается только один раз? Как это можно исправить?
Изначально у меня не было ни observer$destroy()
, ни once = TRUE
. Они были добавлены каждый в попытке остановить запуск кода несколько раз.
Мои версии пакета:
other attached packages:
[1] plyr_1.8.4 shiny_1.2.0