Существует третье решение, использующее тот факт, что каждая кнопка сохраняет количество нажатий. Если бы вы могли отслеживать это количество раз, то любое изменение этого числа укажет, какая кнопка была нажата.
Вот краткая реализация. На странице есть три кнопки (с произвольными названиями):
page <- shinyUI(basicPage(
actionButton("firstbtn",label="Btn1"),
actionButton("secondbtn",label="Btn2"),
actionButton("thirdbtn",label="Btn3"),
textOutput("result")
))
shinyServer <- function(input, output, session) {
# the number of clicks on each button is zero at first
oldBtnClicks <- rep(0,3)
observeEvent({ obs <<- list(input$firstbtn, input$secondbtn, input$thirdbtn) }, ({
# store all button state in a list
BtnState <- obs
# extract in a vector the number of clicks from each
newBtnClicks <- rep(0,3)
for (i in 1:3)
newBtnClicks[i] <- if (is.null(BtnState[[i]])) 0 else BtnState[[i]][1]
# look for the change in the number of clicks
buttonClicked <- match(1, newBtnClicks - oldBtnClicks)
# show the button number that was clicked
output$result <- renderText(expr = buttonClicked)
# update hte number of clicks in the shinyServer environment
oldBtnClicks <<- newBtnClicks
}))
}
shinyApp(ui = page, server = shinyServer)
Функция сервера сначала устанавливает 0 для каждого нажатия кнопки (они еще не были нажаты). Затем устанавливается и наблюдатель, который ищет любую кнопку. Наблюдаемый список может быть произвольной длины.
Когда происходит событие, состояния кнопок извлекаются в виде списка (такого же, как и наблюдаемый список). Из этого списка извлекаются первые элементы каждого подсписка (это количество нажатий на эту конкретную кнопку); если некоторые кнопки могут быть скрыты (как это было в моем собственном приложении), список щелчков равен нулю, и поэтому количество щелчков устанавливается на 0 вручную.
Наконец, если взять разницу между прежним состоянием и новым состоянием, единственное место, которое не равно нулю (найденное с помощью match
), - это позиция нажатой кнопки. После этого не забудьте обновить список состояний кнопок. И вуаля!
Если ваши кнопки имеют обычное имя (например, BtnX, где X идет от 1 до n), то может быть способ построить наблюдаемый список программно, а не путем ручного перечисления кнопок?
person
Denis Cousineau
schedule
16.06.2021