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

在R Shiny中添加模拟曲线至ggplotly绘图的问题排查

问题分析与解决

错误原因

  • 初始状态下List1是空列表,直接执行do.call(rbind, List1())会生成0行空数据框,后续添加id列时会触发行数不匹配的报错。
  • 绘图逻辑没有包裹在Shiny的响应式输出函数中,无法随用户操作动态更新图表。
  • ggplot映射存在错误:数据框列名是level,代码中误用了concentration;颜色映射直接绑定input$Name,无法区分多条历史曲线。
  • ggplotly参数错误,传入的是原始列表而非ggplot生成的图形对象。

修正后的服务器端代码

server <- function(input, output) {

  List1 <- reactiveVal(list())

  observeEvent(input$Add_prediction, {
    # 生成新模拟数据(假设time和level是已定义的变量)
    new_pred <- data.frame(time, Amount(x = time, y = level))
    names(new_pred) <- c("time_pred", "level")
    
    # 更新存储列表
    new_list <- List1()
    new_list[[input$Name]] <- new_pred
    List1(new_list)
  })

  # 响应式处理合并数据
  combined_data <- reactive({
    object <- List1()
    if (length(object) == 0) {
      # 空列表时返回空数据框,避免报错
      return(data.frame(time_pred = numeric(), level = numeric(), id = character()))
    }
    # 合并数据并添加曲线标识
    obj <- do.call(rbind, object)
    obj$id <- factor(rep(names(object), each = sapply(object, nrow)))
    obj
  })

  # 渲染交互式图表
  output$toxicity_plot <- renderPlotly({
    req(combined_data()) # 等待有数据再渲染
    
    p <- ggplot(combined_data()) + 
      geom_line(aes(x = time_pred, y = level, colour = id)) +
      xlab(input$xaxis) +
      ylab(input$yaxis) +
      theme_cowplot() +
      theme(legend.title = element_blank())
    
    ggplotly(p)
  })
}

关键修改点

  • 新增combined_data响应式对象,处理数据合并逻辑,同时判断列表为空的情况,返回空数据框避免报错。
  • 用names(object)作为曲线的标识,替代数字ID,更直观展示用户输入的Name。
  • 将绘图逻辑放入renderPlotly函数中,确保图表随用户操作动态更新。
  • 修正ggplot的y轴映射和颜色映射,匹配实际数据列和多曲线需求。
  • 使用req(combined_data())确保只有当有数据时才渲染图表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:32:52