如何在添加新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
相关产品推荐
相关产品推荐

