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

R Shiny如何正确获取selectInput值调用tq_get获取股票价格数据

核心错误点
  • 响应式对象调用方式错误:你用reactive定义的tickers是Shiny的响应式闭包,不是普通变量,取值时必须加括号写成tickers()才能拿到实际的股票代码向量,直接传tickers给tq_get()相当于传了个函数进去,接口根本识别不了。
  • 提交按钮未绑定触发逻辑:你加了Submit按钮但没有做事件绑定,现有代码只要下拉框选项变动就会自动触发计算,完全不会等待点击提交的操作,和预期交互逻辑不符。
  • 渲染结果未挂载:renderTable生成的表格输出必须赋值给output$prices,同时UI侧要加对应输出占位,否则Shiny找不到渲染结果的挂载位置,页面不会显示表格。
  • 缺少启动校验:应用初次加载时还未产生有效输入,直接跑数据拉取逻辑会抛空值错误。
可直接运行的修正代码
library(shiny)
library(tidyquant)

ui <- fluidPage(
  inputPanel(
    selectInput("ticker1", label = "tickers:",
                choices = c('OR.PA', 'AAPL', 'AMZN', 'MT', 'BNP.PA', 'BTC-USD'), selected = 'AAPL')
  ),
  inputPanel(
    selectInput("ticker2", label = "tickers:",
                choices = c('OR.PA', 'AAPL', 'AMZN', 'MT', 'BNP.PA', 'BTC-USD'), selected = 'AAPL')
  ),
  inputPanel(
    selectInput("ticker3", label = "tickers:",
                choices = c('OR.PA', 'AAPL', 'AMZN', 'MT', 'BNP.PA', 'BTC-USD'), selected = 'AAPL')
  ),
  actionButton("go", "Submit"),
  # 表格输出占位
  tableOutput("prices")
)

server <- function(input, output) {
  # 绑定提交按钮点击事件,仅点击Submit时才更新选中的股票代码
  tickers <- eventReactive(input$go, {
    c(input$ticker1, input$ticker2, input$ticker3)
  })

  output$prices <- renderTable({
    # 未点击提交时中断计算,避免空值报错
    req(tickers())
    # 调用响应式对象必须加()取实际值
    tq_get(
      tickers(),
      from = '2022-01-01',
      to = '2022-05-30',
      get = 'stock.prices'
    )
  })
}

shinyApp(ui, server)
关键修改说明
  • 把普通reactive替换为eventReactive,绑定input$go点击事件,实现“选完代码点提交才拉数据”的效果,避免切换下拉框时频繁调用雅虎财经接口触发限流。
  • 所有响应式对象调用时补全括号:用tickers()代替原来的tickers,确保传入tq_get的是长度为3的股票代码字符向量。
  • 把renderTable的结果赋值给output$prices,同时在UI侧补充tableOutput("prices")作为表格的渲染容器,解决表格不显示的问题。
  • 增加req(tickers())校验,应用刚启动还没点提交时,不会执行后续数据拉取逻辑,避免启动报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:18:19