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
相关产品推荐
相关产品推荐

