每次用户在 onRender htmlwidgets 中交互时删除旧跟踪并添加新跟踪

Removing old trace and adding new trace each time user interacts in onRender htmlwidgets

我的目标是使用 R 包 htmlwidgets 中的 onRender() 函数制作绘图,用户可以在其中单击一个点并绘制一条粗灰色半透明线。我有它的症结所在,如下面的代码所示。

library(plotly)
library(broom)
library(htmlwidgets)

dat <- mtcars
dat$mpg <- dat$mpg * 10

p <- ggplot(data = dat, aes(x=disp,y=mpg)) + geom_point(size=0.5)

ggplotly(p) %>%
  onRender("
           function(el, x, data) {
              el.on('plotly_click', function(e) {

              //Plotly.deleteTraces(el.id, trace1);
              var trace1 = {
                 x: [100, 400],
                 y: [100, 400],
                 mode: 'lines',
                 line: {
                   color: 'gray',
                   width: 100
                 },
                 opacity: 0.5
              }

              //Plotly.deleteTraces(el.id, trace1);
              Plotly.addTraces(el.id, trace1);
           })
          }
          ", data = dat)

留给我的问题是每次用户点击一个点时,灰线的不透明度变得越来越暗。那不是我的意图。在我的实际应用中,灰线的线条粗细也会根据此 MWE 中未包含的其他参数而变化。因此,就这个 MWE 而言,我想确定一种方式,当用户点击一个点时,旧的灰线被删除并绘制新的灰线。

经过一些研究,我最好的选择似乎是使用 Plotly.deleteTraces(el.id, trace1) 函数。我试图在两个地方插入该命令(目前在上面的代码中被注释掉了)。但是,在这两个位置,该命令似乎都阻止绘制任何灰线。我不确定为什么会发生这种情况以及如何解决它。因此,任何关于为什么会发生这种情况以及我如何解决它的信息都会非常有帮助!谢谢。

注意:这是之前 post () 的延续。

您要删除的跟踪对象存储在 x.data[1] 中。这应该有效:

ggplotly(p) %>%
    onRender("function(el, x, data) {
                 el.on('plotly_click', function(e) {

                 if(x.data[1]) Plotly.deleteTraces(el.id, 1);

                 var trace1 = {
                     x: [100, 400],
                     y: [100, 400],
                     mode: 'lines',
                     line: {
                         color: 'gray',
                         width: 100
                     },
                     opacity: 0.5
                 }

                 Plotly.addTraces(el.id, trace1);
                 })
             }", data = dat)