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

R Shiny从ECB API加载数据绘图失败技术求助

解决Shiny应用中ECB API数据无法加载到图表的问题

我看了你的代码,发现几个关键问题导致数据没法正常加载到Plotly图表里,咱们一步步来修正:

核心问题:变量作用域不匹配

你在observeEvent里定义的temp是局部变量,外面的renderPlotly根本访问不到它。Shiny里要在不同反应式组件之间共享数据,必须用反应式值(reactiveVal)或者反应式表达式来存储数据。

其他次要问题

  • UI里的ECB代码存储方式不合理,用data.frame反而增加了取值复杂度
  • Server里重复调用get_data(),既浪费API请求,还容易引发错误
  • 日期处理的代码冗余,可简化

修正后的完整代码

UI部分

library(shiny)
library(lubridate)
library(plotly)
library(ggplot2)

# 定义指标名称和对应的ECB代码(用命名向量更清晰)
ti <- c("PIB","MM_M3","Taux_d_Inflation")
ecb_codes <- c(
  "PIB" = "ICP.M.U2.N.000000.4.ANR",
  "MM_M3" = "BSI.M.U2.Y.V.M30.X.I.U2.2300.Z01.A",
  "Taux_d_Inflation" = "MNA.Q.Y.I8.W2.S1.S1.B.B1GQ._Z._Z._Z.EUR.LR.GY"
)

shinyUI(fluidPage(
  titlePanel("Evolution Economique"),
  sidebarLayout(
    sidebarPanel(
      h1("Indicateur Europe"),
      selectInput("chiffre","Indicateur:", choices = ti),
      actionButton("go","Load"),
      hr(),
      helpText("Donnees Banque Centrale Europeenne")
    ),
    mainPanel(
      plotlyOutput("graph")
    )
  )
))

Server部分

library(shiny)
library(lubridate)
library(plotly)
library(ggplot2)
library(ecb)
library(dplyr) # 用来简化数据整理

shinyServer(function(input, output) {
  # 初始化反应式值,用来存储加载后的数据
  data_to_plot <- reactiveVal(NULL)
  
  # 点击Load按钮时加载并整理数据
  observeEvent(input$go, {
    # 获取选中指标对应的ECB代码
    selected_code <- ecb_codes[input$chiffre]
    # 调用API获取数据
    raw_data <- get_data(selected_code)
    # 整理数据:转换日期格式,重命名列
    cleaned_data <- raw_data %>%
      mutate(Date = ymd(obstime)) %>%
      select(Date, Valeur = obsvalue)
    # 更新反应式值,把整理好的数据存进去
    data_to_plot(cleaned_data)
  })
  
  # 绘制Plotly图表
  output$graph <- renderPlotly({
    # 确保数据加载完成后才绘图,避免空数据报错
    req(data_to_plot())
    
    plot_ly(data_to_plot(), x = ~Date, y = ~Valeur, type = "scatter", mode = "lines") %>%
      layout(title = "Evolution Economique")
  })
})

关键改动说明

  1. 用reactiveVal共享数据:data_to_plot作为反应式值,在observeEvent里更新数据,renderPlotly可以随时读取最新的加载结果,解决了作用域域问题。
  2. 优化ECB代码存储:用命名向量替代data.frame,根据选中的指标直接取值,代码更简洁不易错。
  3. 减少API调用:只调用一次get_data(),避免重复请求浪费资源。
  4. 增加数据校验:用req(data_to_plot())确保只有当数据存在时才渲染图表,避免空数据导致的报错。

内容的提问来源于stack exchange,提问作者Aurélien

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:40:19