c3包在ShinyApp中响应式失效及actionButton异常问题求助
Shiny中c3图表使用reactive对象失效及按钮点击无响应问题
问题说明
- c3图表无法基于reactive对象渲染
在ShinyApp中使用c3包绘制甜甜圈图表时,通过reactive对象传递计算值无法生成图表,但直接使用固定数值可以正常显示。 - actionButton首次点击后失效
按钮首次点击能触发图表生成,但后续点击无法触发更新,尝试shinyjs::reset和reactiveValues计数的方法均无效。
问题原因分析
- 图表渲染失败:
- 你通过
isolate获取了两次相同的reactive值,导致Before和After数值完全一致,c3甜甜圈图表无视觉差异或无法识别有效数据。 - 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
相关产品推荐
相关产品推荐

