使用quantmod包时无法在循环中绘制chart_Series图形求助
问题描述
刚安装了最新版本的R和RStudio,遇到如下情况:
- 单独执行
chart_Series函数能正常绘图,代码示例:
library(quantmod) library(xts) getSymbols('AAPL',src='yahoo') AAPL <- tail(AAPL,200) chart_Series(AAPL[sample(1:200,20)])
- 但在循环里连续调用该函数时,没有报错却只显示空白界面,循环代码:
for(i in 1:10){ chart_Series(AAPL[sample(1:200,20)]) }
- 对比之下,用常规
plot()函数在循环中绘图完全正常,代码示例:
for(i in 1:10){ plot(rnorm(100)) }
会话信息:
> sessionInfo() R version 4.3.0 (2023-04-21 ucrt) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows 7 x64 (build 7601) Service Pack 1 Matrix products: default time zone: Asia/Damascus tzcode source: internal attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] quantmod_0.4.22 TTR_0.24.3 xts_0.13.1 zoo_1.8-12 loaded via a namespace (and not attached): [1] compiler_4.3.0 tools_4.3.0 curl_5.0.0 grid_4.3.0 [5] jsonlite_1.8.4 lattice_0.21-8
解决办法
chart_Series基于grid绘图系统,和基础绘图的plot()逻辑不同——在循环、函数内部这类场景下,它不会自动渲染输出,需要手动触发。
方法1:用print()包裹绘图语句
修改循环代码,让绘图对象被显式打印:
for(i in 1:10){ print(chart_Series(AAPL[sample(1:200,20)])) }
方法2:每次绘图前新建图形设备
如果需要每个图形单独在新窗口显示,可以添加dev.new():
for(i in 1:10){ dev.new() chart_Series(AAPL[sample(1:200,20)]) }
原理说明
基础绘图的plot()属于即时渲染系统,执行时直接输出到图形设备;而chart_Series这类基于grid/lattice的函数,会先生成一个绘图对象,只有当这个对象被打印时才会实际渲染。在交互式环境单独执行时,R会自动帮你打印对象,但循环里需要手动调用print()触发。
内容的提问来源于stack exchange,提问作者mr.T
相关产品推荐
相关产品推荐

