En la documentación de RStudio sobre eventos de javascripts en shiny https://shiny.rstudio.com/articles/js-events.html , hay este ejemplo para el evento shiny:value :
$('#foo').on('shiny:value', function(event) { // append a character string to the output value event.value += ' Oh that is nice!'; }); // use event.target to obtain the output element $(document).on('shiny:value', function(event) { // cancel the output of the element with id 'foo' if (event.target.id === 'foo') { event.preventDefault(); } });y dice:
Dado que estos eventos se activan específicamente en un elemento de salida, puede agregar el oyente en el elemento de salida en lugar de en el documento, aunque este último también funciona, por ejemplo.
pero cuando trato de usar el primer método en mi aplicación brillante, parece que no funciona.
Por ejemplo, si ejecuta la aplicación a continuación, solo funciona el método con el selector $(document) y activa un mensaje.
library(shiny) ui <- fluidPage( tags$head( tags$script( "$('#my_table').on('shiny:value', function(event) { alert('MSG 1'); });" ), tags$script( "$(document).on('shiny:value', function(event) { if (event.target.id === 'my_table') { alert('MSG 2'); } });" ) ), sliderInput("my_slider", "Rows", 1, 20, 1), tableOutput("my_table") ) server <- function(input, output, session) { output$my_table <- renderTable(iris[1:input$my_slider, ]) } shinyApp(ui, server)Supongo que me falta algo como en la documentación, dice que el método 2 debería funcionar. Cualquier ayuda apreciada, gracias
Eso es porque la tabla aún no existe (no está en el DOM) cuando se lee el script. Tu puedes hacer:
$(document).ready(function(){ $('#my_table').on('shiny:value', function(event) { alert('MSG 1'); }); }); Otra forma en que debería funcionar es colocar el script al final de la interfaz de usuario, sin tags$head .