[英]R shiny - last clicked button id
我有多個操作按鈕,我想在這些按鈕上顯示不同的選擇輸入,並且我想知道上次單擊的按鈕 ID,我該怎么做? 當我使用
which(lapply(c(1:10), function(i) { input[[paste0("ActionButton", i)]]}) == TRUE)
它向我顯示了所有被點擊的按鈕,但是我想知道哪個是最后一個,以便再次點擊以前的按鈕。 我該怎么做? 我是閃亮的新手,不確定是否了解所有反應/隔離問題,所以我會很樂意提供任何提示。
你可以通過添加JS來實現
有點像
$(document).on('click', '.needed', function () {
Shiny.onInputChange('last_btn',this.id);
});
示例(如果您不想控制所有 btn,則將needed
類添加到 btn)
ui <- shinyUI(fluidPage(
titlePanel("Track last clicked Action button"),
tags$head(tags$script(HTML("$(document).on('click', '.needed', function () {
Shiny.onInputChange('last_btn',this.id);
});"))),
sidebarLayout(
sidebarPanel(
actionButton("first", "First",class="needed"),
actionButton("second", "Second",class="needed"),
actionButton("third", "Third",class="needed"),
actionButton("save", "save"),
selectInput("which_","which_",c("first","second","third"))
),
mainPanel(
textOutput("lastButtonCliked")
)
)
))
server <- shinyServer(function(input, output,session) {
observeEvent(input$save,{
updateSelectInput(session,"which_",selected = input$last_btn)
})
output$lastButtonCliked=renderText({input$last_btn})
})
# Run the application
shinyApp(ui = ui, server = server)
此代碼跟蹤最后單擊哪個按鈕:
library(shiny)
ui <- shinyUI(fluidPage(
titlePanel("Track last clicked Action button"),
sidebarLayout(
sidebarPanel(
actionButton("first", "First"),
actionButton("second", "Second"),
actionButton("third", "Third")
),
# Show a plot of the generated distribution
mainPanel(
textOutput("lastButtonCliked")
)
)
))
server <- shinyServer(function(input, output) {
rv <- reactiveValues(lastBtn = character())
observeEvent(input$first, {
if (input$first > 0 ) {
rv$lastBtn = "first"
}
})
observeEvent(input$second, {
if (input$second > 0 ) {
rv$lastBtn = "second"
}
})
observeEvent(input$third, {
if (input$third > 0 ) {
rv$lastBtn = "third"
}
})
output$lastButtonCliked <- renderText({
paste("Last button clicked: ", rv$lastBtn)
})
})
# Run the application
shinyApp(ui = ui, server = server)
帶有許多按鈕的 lapply 版本。 歸功於@Victorp 和這個答案。
這是代碼:
library("shiny")
ui <- fluidPage(
fluidRow(
column(
width = 6,
lapply(
X = 1:5,
FUN = function(i) {
actionButton(inputId = paste0("button", i), label = paste("Button ", i))
}
)
),
column(
width = 6,
textOutput("lastButtonCliked")
)
)
)
server <- function(input, output){
rv <- reactiveValues(lastBtn = character())
lapply(
X = 1:6,
FUN = function(i){
observeEvent(input[[paste0("button", i)]], {
if (input[[paste0("button", i)]] > 0) {
rv$lastBtn = paste0("button", i)
}
})
}
)
output$lastButtonCliked <- renderText({
paste("Last button clicked: ", rv$lastBtn)
})
}
shinyApp(ui = ui, server = server)
有第三種解決方案利用每個按鈕保持被按下的次數這一事實。 如果您可以監控該時間數,那么該數字的任何變化都將表明按下了哪個按鈕。
這是一個簡短的實現。 該頁面具有三個按鈕(具有任意名稱):
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),那么可能有一種方法可以通過編程方式構建觀察列表,而不是手動枚舉按鈕?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.