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

c3包在ShinyApp中响应式失效及actionButton异常问题求助

Shiny中c3图表使用reactive对象失效及按钮点击无响应问题

问题说明

  1. c3图表无法基于reactive对象渲染
    在ShinyApp中使用c3包绘制甜甜圈图表时,通过reactive对象传递计算值无法生成图表,但直接使用固定数值可以正常显示。
  2. actionButton首次点击后失效
    按钮首次点击能触发图表生成,但后续点击无法触发更新,尝试shinyjs::reset和reactiveValues计数的方法均无效。

问题原因分析

  • 图表渲染失败:
    1. 你通过isolate获取了两次相同的reactive值,导致Before和After数值完全一致,c3甜甜圈图表无视觉差异或无法识别有效数据。
    2. c3甜甜圈图表需要行格式数据(每行对应一个类别),而你构造的是列格式数据,不符合c3的解析要求。
  • 按钮失效:
    req(input$dbtn1)仅判断按钮是否被点击过一次,首次点击后该条件始终为真,后续点击无法触发渲染逻辑重新执行。

解决方案

1. 修复c3图表渲染问题

调整数据格式为行结构,并确保两个类别数值不同,同时正确指定c3的x/y轴映射:

2. 修复按钮点击无响应问题

使用eventReactive封装按钮触发的数据逻辑,让每次点击都能触发图表更新。

完整修正代码

library(shiny)
library(shinyjs)
library(dplyr)

ui <- fluidPage(
  shinyjs::useShinyjs(),
  
  column(
    width = 12,
    actionButton(
      inputId = "dbtn1",
      label = "Click me!"
    ),
    sliderInput(
      inputId = "id1",
      label = "Choose 1",
      value = 5,
      min = 1, 
      max = 10, 
      step = 1
    ),
    sliderInput(
      inputId = "id2",
      label = "Choose 2",
      value = 5,
      min = 1, 
      max = 10, 
      step = 1
    )
  ),
  
  c3::c3Output(outputId = "dsgraph")
  
)

server <- function(input, output, session) {
  
  reac1 <- reactive({
    fx <- function(x, y) {
      x + y
    }
    fx(
      x = input$id1,
      y = input$id2
    )
  })
  
  # 用eventReactive绑定按钮点击事件,每次点击生成新的图表数据
  chart_data <- eventReactive(input$dbtn1, {
    q_val <- reac1()
    # 构造行格式数据,确保两个类别数值不同(可根据需求调整数值逻辑)
    data.frame(
      category = c("Before", "After"),
      value = c(q_val, 20 - q_val)
    )
  })
  
  output$dsgraph <- c3::renderC3({
    req(chart_data())
    
    chart_data() %>%
      c3::c3(x = "category", y = "value") %>% # 指定x轴为类别,y轴为数值
      c3::c3_donut(title = "Show donut")
  })
  
}

shinyApp(ui, server)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:07:57