R gráficamente: cómo observar si un rastro está oculto o se muestra a través de clics de leyenda con múltiples gráficos

Estoy tratando de averiguar qué rastros oculta el usuario de un diagrama de dispersión al deseleccionarlos en la leyenda interactiva de plotly.

He leído estoASI QU post, y las preguntas similares vinculadas en los comentarios a continuación y esto me acercó a la solución

La solución actual solo está haciendo parcialmente lo que necesito. Dos cosas que estoy buscando para mejorar es: - ¿Cómo ver en qué leyenda de la trama se hace clic (mirando el 'id' de origen?) - Ahora puedo ver que se hace clic en una entrada de leyenda, pero necesito poder ver si se hace clic en 'ON' (mostrar seguimiento) o 'OFF'

La salida que estoy buscando se vería así:input$trace_plot1: que es entonces una lista de todos los rastreos que están apagados y que están encendidos, o un solo rastro nr en cada clic, pero eso indica si ese rastreo específico ahora está "ON" u "OFF"

El objetivo para mí es vincular la ocultación visual y la visualización de una visión general de todos mis grupos en los datos donde el usuario ahora puede darles nuevos nombres, colores y elegir mantener o soltar el grupo con un botón que tiene una T / F interruptor de estado detrás de él. Me gustaría vincular ese estado T / F de los botones al 'mostrar' / 'oculto' de trazas de un gráfico específico (ya que tengo 5 copias de estos gráficos en mi aplicación que muestran los datos en diferentes etapas del proceso de análisis .

Aquí está mi intento que no reacciona a la leyenda de alguna manera, solo al zooom:

library(plotly)
library(shiny)
library(htmlwidgets)

js <- c(
  "function(el, x){",
  "  el.on('plotly_legendclick', function(evtData) {",
  "    Shiny.setInputValue('trace', evtData.data[evtData.curveNumber].name);",
  "  });",
  "}")

iris$group <- c(rep(1,50), rep(2, 50), rep(3,50))

ui <- fluidPage(
  plotlyOutput("plot1"),
  plotlyOutput("plot2"),
  verbatimTextOutput("legendItem")

)


server <- function(input, output){

  output$plot1 <- renderPlotly({
    p <- plot_ly(source = 'plotly1', data = iris, x = ~Sepal.Length, y = ~Petal.Length, color = ~as.factor(group), type = 'scatter', mode = 'markers') %>%
      layout(showlegend = TRUE)

    p %>% onRender(js)

    })

  output$plot2 <- renderPlotly({
    p <- plot_ly(source = 'plotly2', data = iris, x = ~Sepal.Length, y = ~Petal.Length, color = ~as.factor(group), type = 'scatter', mode = 'markers') %>%
      layout(showlegend = TRUE)

    p %>% onRender(js)

  })

  output$legendItem <- renderPrint({
    d <- input$trace
    if (is.null(d)) "Clicked item appear here" else d
  })

  }

shinyApp(ui = ui, server = server)

EDIT: SOLUCIÓN DE TRABAJO GRACIAS A LA AMPLIA RESPUESTA de S.L.

library(plotly)
library(shiny)
library(htmlwidgets)

js <- c(
  "function(el, x, inputName){",
  "  var id = el.getAttribute('id');",
  "  var d3 = Plotly.d3;",
  "  el.on('plotly_restyle', function(evtData) {",
  "    var out = {};",
  "    d3.select('#' + id + ' g.legend').selectAll('.traces').each(function(){",
  "      var trace = d3.select(this)[0][0].__data__[0].trace;",
  "      out[trace.name] = trace.visible;",
  "    });",
  "    Shiny.setInputValue(inputName, out);",
  "  });",
  "}")


ui <- fluidPage(
  plotlyOutput("plot1"),
  plotlyOutput("plot2"),
  verbatimTextOutput("tracesPlot1"),
  verbatimTextOutput("tracesPlot2")
)

server <- function(input, output, session) {

output$plot1 <- renderPlotly({
    p1 <- plot_ly()
    p1 <-  add_trace(p1, data = mtcars, x = ~disp, y = ~mpg, type = 'scatter', mode = 'markers', color = ~as.factor(cyl))
    p1 %>% onRender(js, data = "tracesPlot1")    
  })

  output$plot2 <- renderPlotly({
    p2 <- plot_ly()
    p2 <- add_trace(p2, data = mtcars, x = ~disp, y = ~mpg, type = 'scatter', mode = 'markers', color = ~as.factor(cyl))
    p2 %>% onRender(js, data = "tracesPlot2")  })


  output$tracesPlot1 <- renderPrint({ unlist(input$tracesPlot1)  })

  output$tracesPlot2 <- renderPrint({unlist(input$tracesPlot2)
  })

}

shinyApp(ui, server)

Respuestas a la pregunta(1)

Su respuesta a la pregunta