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.

Las opciones de acercar y reiniciar los controladores no funcionan cuando se colocan en UiOutput en una aplicación Shiny

Tengo la aplicación shiny a continuación en la cual uso js para añadir controles para hacer zoom y resetear en un archivo svg. Estaba funcionando hasta el momento en que puse la salida dentro de otro UiOutput.

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

js <- "
$(document).ready(function(){
var element = document.getElementById('grr');
var instance = panzoom(element);
var z = 1;
$('#zoomout').on('click', function(){
instance.smoothZoom(0, 0, 0.9);
z *= 0.9;
});
$('#zoomin').on('click', function(){
instance.smoothZoom(0, 0, 1.1);
z *= 1.1;
});
$('#reset').on('click', function(){
instance.smoothZoom(0, 0, 1/z);
z = 1;
});
$('#zoomout').on('dblclick', function(){
return false;
});
$('#zoomin').on('dblclick', function(){
return false;
});
});
"

ui <- fluidPage(
  tags$head(
    tags$script(src = 'https://unpkg.com/panzoom@9.4.0/dist/panzoom.min.js'),
    tags$script(HTML(js))
  ),

  uiOutput('main')
  #grVizOutput('grr', width = '100%', height = '90vh'),

)

server <- function(input, output) {

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

      actionGroupButtons(
        inputIds = c('zoomout', 'zoomin', 'reset'),
        labels = list(icon('minus'), icon('plus'), 'Reset'),
        status = 'primary'
      )
    )

  })
  output$grr <- renderGrViz(render_graph(
    create_graph() %>%
      add_n_nodes(n = 2) %>%
      add_edge(
        from = 1,
        to = 2,
        edge_data = edge_data(
          value = 4.3
        )
      )
  ))

}

shinyApp(ui, server)
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con la aplicación de Shiny es que el código javascript no puede encontrar el elemento svg con el ID grr porque se está renderizando dentro de otro elemento div debido al uso de renderUI en la función output$main. Para solucionar este problema, mueva el actionGroupButtons fuera del elemento div como se muestra a continuación:

    output$main <- renderUI({
        div(
          grVizOutput("grr", width = "100%", height = "90vh")
        )
    })
    
    fluidRow(
      actionGroupButtons(
        inputIds = c("zoomout", "zoomin", "reset"),
        labels = list(icon("minus"), icon("plus"), "Reiniciar"),
        status = "primary"
      )
    )
    

    Esto renderizará los controles de zoom fuera del div que contiene el elemento svg y el código javascript podrá localizar el elemento svg utilizando su ID, grr.

Comments are closed.