R plotly: como observar se um traço está oculto ou mostrado através de cliques de legenda com vários gráficos

Estou tentando descobrir quais rastreamentos o usuário oculta de um gráfico de dispersão desmarcando-o na legenda interativa do plotl

Eu li issoENTÃ post, e as perguntas semelhantes vinculadas nos comentários abaixo e isso me aproximaram da solução

A solução atual está fazendo apenas parcialmente o que eu preciso. Duas coisas que estou procurando para aprimorá-lo são: - como ver qual legenda da trama é clicada (olhando para o 'id' de origem?) - Agora posso ver que uma entrada de legenda é clicada, mas preciso ser capaz de ver se é clicado em 'ON' (mostrar rastreio) ou 'OFF'

A saída que estou procurando seria algo como isto:input$trace_plot1: que é uma lista de todos os rastreamentos desativados e ativados, ou um único rastreamento a cada clique, mas informa se esse rastreamento específico está agora "ON" ou "OFF"

O objetivo para mim é vincular a ocultação visual e a exibição a uma visão geral de todos os meus grupos nos dados em que o usuário agora pode dar novos nomes, cores e optar por manter ou largar o grupo com um botão com um T / F estado alternar por trás dele. Gostaria de vincular esse estado T / F dos botões ao 'show' / 'oculto' de traços de um gráfico específico (já que tenho 5 cópias desses gráficos no meu aplicativo mostrando os dados em diferentes estágios do processo de análise .

Aqui está minha tentativa que não reage de alguma forma à lenda, apenas ao 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: SOLUÇÃO DE TRABALHO OBRIGADA À RESPOSTA EXTENSIVA 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)

questionAnswers(1)

yourAnswerToTheQuestion