You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在添加新trace时删除上一条trace(shiny+plotly场景)

问题解决

核心问题说明

你的代码存在两个导致功能失效的问题:

  • deleteTraces 方法必须传入要删除的trace的索引值,不传参数时不会执行任何删除操作
  • 没有记录自定义trace的添加状态,无法在新增trace前自动删除上一次添加的内容

完整修改后可运行代码

library(shiny)
library(plotly)

ui <- fluidPage(plotlyOutput("fig1"),
                numericInput("A",
                             label = h5("A"),
                             value = "",
                             width = "100px"),
                numericInput("B",
                             label = h5("B"),
                             value = "",
                             width = "100px"),
                actionButton("action3", label = "Add to plot"),
                actionButton("action4", label = "Remove point")
)

server <- function(input, output) {
  A <- 1:5
  B <- c(115, 406, 1320, 179, 440)
  data <- data.frame(A, B)
  
  fig <- plot_ly(data, x = A, y = B, type = 'scatter', mode = 'markers')
  
  output$fig1 <- renderPlotly(fig)
  
  # 记录是否已添加自定义trace
  has_custom_trace <- reactiveVal(FALSE)
  
  observeEvent(input$action3, {
    # 校验输入不为空
    req(input$A, input$B)
    proxy <- plotlyProxy("fig1")
    # 已存在自定义trace时先删除上一次的
    if(has_custom_trace()) {
      proxy %>% plotlyProxyInvoke("deleteTraces", 1)
    }
    # 新增trace,额外加了颜色区分新点,可自行删除
    proxy %>%
      plotlyProxyInvoke("addTraces", 
                        list(x = input$A,
                             y = input$B,
                             type = "scatter",
                             mode = "markers",
                             marker = list(color = "red", size = 10)
                        )
      )
    has_custom_trace(TRUE)
  })
  
  observeEvent(input$action4, {
    if(has_custom_trace()) {
      plotlyProxy("fig1") %>%
        plotlyProxyInvoke("deleteTraces", 1)
      has_custom_trace(FALSE)
    }
  })
}

shinyApp(ui,server)

修改点说明

  • 新增了reactiveVal类型的状态变量has_custom_trace,用来标记当前图表是否存在用户添加的自定义trace
  • 初始生成的原始散点图trace索引为0,后续新增的自定义trace索引固定为1,因此每次新增前删除索引为1的trace即可实现替换效果
  • 给添加按钮逻辑增加了req校验,避免输入为空时触发报错
  • 修复了删除按钮的逻辑,点击时仅删除用户添加的自定义trace,不会影响原始数据的展示

内容的提问来源于stack exchange,提问作者Reza Khayami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:54:03