es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La técnica de JavaScript para capturar clics en una aplicación Shiny no captura el ID del nodo.

Tengo la siguiente aplicación shiny a continuación, en la cual utilizo una técnica de JavaScript para capturar clics en la aplicación sin necesidad de utilizar elementos de entrada de Shiny. Funciona bien, pero no en los nodos, ya que quiero poder capturar los nodos y obtener el ID del nodo.

La lógica es la siguiente: hago clic en el texto "Click me" o en los nodos, luego en la consola de RStudio escribo input$js.node_clicked. El resultado debería ser “one1″, lo cual acepto ya que "one" corresponde al nodo y “1″ corresponde a la secuencia de clics. Pero cuando hago clic en los nodos, solo obtengo “1″ y no el ID del nodo “one1″. La lógica proviene de aquí.

library(shiny)
library(shinyWidgets)
library(DiagrammeR)
library(magrittr)

js <- '
$(document).on("click", ".node", function(e) {
    if(typeof BUTTON_CLICK_COUNT == "undefined") {
        BUTTON_CLICK_COUNT = 1;
    } else {
        BUTTON_CLICK_COUNT ++;
    }
    Shiny.onInputChange("js.node_clicked",
                        e.target.id + "_" + BUTTON_CLICK_COUNT);
});
'

ui <- fluidPage(
    tags$script(HTML(js)),
    div(id="one","click me",class="node"),
    uiOutput("main")
)

server <- function(input, output) {

    output$main <- renderUI({
        tagList(
            div(
                grVizOutput("grr", width = "100%", height = "90vh")
            ))
    })

    output$grr <- renderGrViz(grViz( "digraph test{
        A[tooltip='A word'];
        B[tooltip='Another word'];
        A -> B;}" )
    )

    observeEvent(input$js.node_clicked , {
        browser()
    }) 

}

shinyApp(ui, server)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Problema con la captura del ID del nodo en una aplicación shiny utilizando una técnica de JavaScript

    La aplicación shiny proporcionada contiene una técnica de JavaScript que captura los clics en la aplicación sin usar elementos de entrada de shiny. La técnica funciona correctamente para capturar los clics en texto como “Haz clic aquí”, pero no logra capturar el ID del nodo cuando se hace clic en los nodos. En su lugar, solo captura la secuencia de clics, representada por “_1”.

    La lógica del código JavaScript es incrementar la variable BUTTON_CLICK_COUNT con cada clic y luego vincular el valor resultante a js.node_clicked utilizando Shiny.onInputChange().

    Para solucionar este problema y capturar el ID del nodo además de la secuencia de clics, podemos modificar el código JavaScript para incluir el ID del nodo en js.node_clicked. Podemos lograr esto reemplazando e.target.id en el código con $(this).attr('id'), como se muestra a continuación:

    $(document).on("click", ".node", function(e) {
      if(typeof BUTTON_CLICK_COUNT == "undefined") {
        BUTTON_CLICK_COUNT = 1;
      } else {
        BUTTON_CLICK_COUNT ++;
      }
      var node_id = $(this).attr('id');
      Shiny.onInputChange("js.node_clicked",
                          node_id + "_" + BUTTON_CLICK_COUNT);
    });
    

    Con esta modificación, al hacer clic en un nodo se capturará tanto el ID del nodo como la secuencia de clics como se esperaba.

    observeEvent(input$js.node_clicked , {
            print(input$js.node_clicked)
    })
    

    Esto imprimirá el ID del nodo y la secuencia de clics en la consola de R al hacer clic en un nodo.

Comments are closed.