Quiero activar un reactivo que contenga la identificación de entrada de la última entrada en la que se hizo clic. Lo que tengo funciona bien para algunas entradas como numericInput y textInput . Pero no funciona para selectInput o selectizeInput . Intenté usar una variedad de selectores en la expresión JS, pero ninguno captura selectInput o selectizeInput .
Aquí hay un reprex. Cuando hace clic en cualquiera de las dos primeras entradas, renderText se actualiza, pero no con las dos últimas.
library(shiny) ui <- fluidPage( tags$head( tags$script( htmlwidgets::JS("$( document ).on('click', '.form-control, .shiny-bound-input, .selectized', function() { Shiny.setInputValue('last_input', this.id); });") ) ), numericInput("num1", "Numeric", 0), textInput("text1", "Text"), selectInput("select1", "Select", choices = LETTERS[1:4]), selectInput("selectize1", "Selectize", choices = letters[1:4]), textOutput("textout") ) server <- function(input, output, session) { output$textout <- renderText({ input$last_input }) } shinyApp(ui, server)Esto se debe a que la identificación se atribuye al elemento select y no hace clic en este elemento.
Mi primera idea fue buscar el primer elemento principal que tuviera una identificación:
tags$script( HTML("$( document ).on('click', '.form-control, .shiny-bound-input, .selectized', function() { var $parentWithId = $(this).closest('*[id]'); Shiny.setInputValue('last_input', $parentWithId.attr('id')); });") ) pero eso todavía no funciona para selectizeInput .
Tal vez prefieras querer:
tags$script( HTML("$(document).on('shiny:inputchanged', function(event) { Shiny.setInputValue('last_input', event.name); });") )que devuelve el id de la última entrada modificada.
Como notó en su comentario, este método también establece last_input cuando el cambio es causado por el servidor por una función de update* . Aquí está cómo prevenir eso:
tags$script( HTML("$(document) .on('shiny:updateinput', function(e) { $(e.target).one('shiny:inputchanged', function(ev) { ev.stopPropagation(); }); }) .on('shiny:inputchanged', function(e) { Shiny.setInputValue('last_input', e.name); });") )