如何在R中自动化含for循环的函数以动态接收股票代码输入
问题分析与解决方案
你的代码无法批量获取股票数据,主要源于三个核心问题:错误的参数传递语法、全局变量的局部覆盖问题,以及冗余的列名处理逻辑。以下是针对性的修正方案:
修正后的函数代码
library(tidyverse) library(quantmod) fetch_stock_data_fn <- function(stock_name){ # 直接传递字符串参数,无需tidyeval注入语法 df_quant <- quantmod::getSymbols(Symbols = stock_name, src="yahoo", from = "2021-05-01", auto.assign = F) %>% data.frame(as.matrix(.), Date = time(.), row.names = NULL) %>% # 一步完成Symbol列的生成与清理,用fixed()避免正则误匹配 mutate(Symbol = str_remove(stock_name, fixed(".NS"))) %>% select(Date, Symbol, everything()) # 批量处理列名,替代冗余的for循环 colnames(df_quant)[3:ncol(df_quant)] <- str_remove( colnames(df_quant)[3:ncol(df_quant)], paste0(fixed(stock_name), fixed(".")) ) # 返回整理后的单只股票数据 df_quant %>% select(Date:Adjusted) }
批量调用的两种方式
方式1:用lapply批量处理(更简洁)
test_vector <- c("SHREECEM.NS","ADANIPORTS.NS") df_final <- lapply(test_vector, fetch_stock_data_fn) %>% bind_rows()
方式2:用循环手动累积结果
test_vector <- c("SHREECEM.NS","ADANIPORTS.NS") # 初始化空结果表 df_final <- setNames(data.frame(matrix(ncol = 8, nrow = 0)), c("Date", "Symbol", "Open","High","Low","Close","Volume","Adjusted")) for (stock in test_vector){ df_temp <- fetch_stock_data_fn(stock) df_final <- rbind(df_final, df_temp) }
关键修改说明
- 移除
{{}}注入语法:stock_name是字符串参数,getSymbols直接接受字符串输入,{{}}是tidyeval中处理裸变量的语法,此处完全多余,反而会导致参数解析错误。 - 避免全局变量的局部覆盖:原函数内的
df_append <- rbind(df_append, df_quant)会创建局部变量,无法修改全局的空表。修正后让函数返回单只股票数据,在外部统一合并,消除了全局变量的副作用。 - 简化列名处理逻辑:用向量操作替代for循环,同时用
fixed()处理点号(正则中点号匹配任意字符,fixed()强制匹配字面意义的点号),避免意外匹配。 - 精简Symbol列生成:直接在
mutate中一步完成股票代码的清理,无需多余的中间赋值。
内容的提问来源于stack exchange,提问作者ViSa
相关产品推荐
相关产品推荐

