Вы были почти там, но были некоторые незначительные проблемы с форматированием. Обновленный код указан ниже.
Вы в основном неправильно использовали HTML
(я изменил его на JS
, но это не проблема) так, как вы просто запятую отделяли ns("last_btn")
. Если бы вы проверили вывод вашего оригинального оператора HTML(...)
, вы бы увидели, что результирующая строка JavaScript была
Shiny.onInputChange(' link_id-last_btn ', this.id);
И я имею в виду пробелы вокруг входного идентификатора. Из-за лишних пробелов входные данные не были правильно отображены на input$last_btn
. Я использовал paste0
в своем примере, чтобы правильно склеить строки.
Во-вторых, есть некоторые пропущенные ns
вызовы, которые я исправил, но вы наверняка узнали бы сами, как только блокировщик ввода исчезнет.
user_inputUI <- function(id){
# Create a namespace function using the provided id
ns <- NS(id)
tagList(
tags$head(
tags$script(
JS(paste0("$(document).on('click', '.needed', function () {debugger;
Shiny.onInputChange('", ns("last_btn"), "', this.id);
});"))
)
),
tags$span(HTML(paste0('<div><input id="', ns("first"), '" type="checkbox" class="needed"></div>'))),
actionButton(ns("second"), "Second", class="needed"),
actionButton(ns("third"), "Third", class="needed"),
actionButton(ns("save"), "save"),
selectInput(ns("which_"), "which_", c(ns("first"), ns("second"), ns("third")))
)
}
update_options <- function(input, output, session) {
observeEvent(input$last_btn, {
print(input$last_btn)
})
observeEvent(input$save, {
updateSelectInput(session, "which_", selected = input$last_btn)
})
return(reactive(input$last_btn))
}
ui <- shinyUI(fluidPage(
titlePanel("Track last clicked Action button"),
sidebarLayout(
sidebarPanel(
user_inputUI("link_id")
),
mainPanel(
textOutput("lastButtonCliked")
)
)
))
server <- shinyServer(function(input, output,session) {
last_id <- callModule(update_options, "link_id")
output$lastButtonCliked=renderText({last_id()})
})
# Run the application
shinyApp(ui = ui, server = server)