R语言如何动态生成lines函数参数?paste0拼接传参出现转换警告
R动态为lines传参的修正方案
问题根因
你当前写法无法正常运行的核心原因:paste0(gdaxisymbol[i],"$",gdaxisymbol[i],".Adjusted") 拼出来的是纯文本字符串,比如"ALV.DE$ALV.DE.Adjusted"。
R的函数不会自动把输入的字符串解析成对应的对象引用,lines()接收到这个文本字符串后,会强制把它转换为数值坐标,文本无法转为有效数值,就会生成NA,触发德语提示的In xy.coords(x, y) : NAs durch Umwandlung erzeugt警告。
而你手动写的lines(ALV.DE$ALV.DE.Adjusted)能正常运行,是因为这是R语法层面的直接对象访问,不是字符串输入。
需要特别区分场景:如果是作为xts对象的列索引,用字符串写列名是完全合法的语法;但如果把“对象名$列名”整段拼成字符串直接传给lines(),函数会把整段文本当成绘图坐标的输入,完全不会把它识别为R表达式进行解析。
正确实现方式
因为你用getSymbols()拉取数据时开了auto.assign = TRUE,每只股票的完整xts数据对象会直接存在全局环境中,对象名和对应的股票代码完全一致,不需要拼接带$的字符串,分两步取值即可:
- 用
get(股票代码)从全局环境取出对应股票的完整数据对象 - 对取出的对象直接访问Adjusted列(这一步可以用字符串拼接列名,完全符合xts的列索引语法),传给
lines()
修正后的核心循环代码:
# 初始绘制第一只股票的价格曲线 plot(ADS.DE$ADS.DE.Adjusted) # 遍历所有成分股循环画线 for(i in seq_along(gdaxisymbol)) { # 动态获取当前股票的完整数据 current_stock <- get(gdaxisymbol[i]) # 取对应调整后价格列,绘制线条 lines(current_stock[, paste0(gdaxisymbol[i], ".Adjusted")], col = i) }
注:不要用
eval(parse(text = 拼接的字符串))这种方式解析带$的文本,这类写法可读性差、易触发隐蔽的作用域bug,是R中非常不推荐的动态取值姿势。
绘图优化建议
- 循环边界不要硬写
1:30,改用seq_along(gdaxisymbol)可以自动适配成分股数量变化,避免越界漏画 - 初始绘图时提前计算所有股票价格的最大最小值,设置
ylim参数,避免后续绘制的线条因超出初始坐标范围被截断 - 给不同股票的线条设置差异化颜色,避免多线叠加后无法区分
内容的提问来源于stack exchange,提问作者topi
相关产品推荐
相关产品推荐

