R quantmod代码不同环境运行结果差异问题排查
问题1解答
是,两处异常均由代码错误直接导致。
问题2解答
具体有2个核心错误点:
- 循环变量引用错误:第二段代码的for循环中,
assign方法的第二个参数错误使用了第一段代码遗留的全局变量i,而非当前循环的迭代变量i2。这会导致循环逻辑混乱,对已经完成fortify.zoo转换的data.frame对象重复执行转换操作:fortify.zoo会给输入对象新增一列Index存储时间索引,重复执行就会生成第二个Index列,最终列数变为8。 - 遍历环境获取对象名逻辑错误:R的环境是哈希表结构,本身不保留对象写入的顺序,
eapply遍历环境的顺序是哈希表内部存储的顺序,和你传入t2的ticker顺序没有关联,因此输出的股票顺序错乱。
问题3解答
修复方案如下:
- 修正循环变量引用错误,直接使用你定义的ticker列表
t2作为遍历对象,既避免变量污染,又能保留原始顺序,不需要额外遍历环境找xts对象。 - 转换前先判断对象类型,避免对非xts对象重复转换。
修复后的参考代码:
library(quantmod) symbolUpdates.env <- new.env() # 定义ticker列表,后续直接用这个列表控制顺序 t2 <- c("NKLA", "MPNGF", "RMO", "JD", "MSFT") getSymbols.yahoo(t2, auto.assign = TRUE, env = symbolUpdates.env, from = "2020-01-01", to = "2021-02-02") closeAllConnections() # 直接遍历t2列表,保留原始顺序 for (ticker in t2) { obj <- get(ticker, envir = symbolUpdates.env) # 仅对xts类型执行转换 if (is.xts(obj)) { assign(ticker, fortify.zoo(obj), envir = symbolUpdates.env) } } # 直接用t2取数,顺序和输入完全一致 sapply(mget(t2, envir = symbolUpdates.env), names)
问题4解答
R中所有环境(包括全局环境、自定义环境)的本质是无序哈希表结构,对象按照哈希值存储,没有写入顺序的记录。你使用eapply遍历自定义环境获取xts对象名时,返回的名称顺序是哈希表的内部存储顺序,和你传入ticker的顺序、对象写入环境的顺序都没有关系,因此顺序不会被保留。你第一段代码顺序看似正常只是巧合,全局环境的eapply遍历顺序同样不保证和输入ticker顺序一致。
内容的提问来源于stack exchange,提问作者pdeli
相关产品推荐
相关产品推荐

