说在前面
在用R语言做数据分析处理的过程中,我们经常会碰到一些数据量比较大进而导致循环执行好久的情况。等待的过程太煎熬了,关键的是我们不知道现在已经完成了多少进度,从而决定是否停止重新修改代码。
有人建议我们可以用cat函数来不断进行打印实现这一目的,然而再某些循环中,所有的cat语句输出结果会在所有代码运行完成之后才会显示,而不是我们期望的一次循环即是输出一条cat语句。
tcltk包
所以我们就必须借助的R包来实现这个功能。一些论坛上的文章介绍了tcltk这个包,其中有一个函数tkProgressBar便可以帮助我们做到这一点。具体代码如下:
library(tcltk)
u <- 1:2000
#开启进度条
pb <- tkProgressBar("进度","已完成 %", 0, 100)
for(i in u) {
info<- sprintf("已完成 %d%%", round(i*100/length(u)))
setTkProgressBar(pb, i*100/length(u), sprintf("进度 (%s)", info),info)
}
#关闭进度条
close(pb)
我们可以看到使用方法非常简单,首先加载tcltk包并用tkProgressBar开启进度条。其中我们这个例子中,title属性为“进度”,label是“已完成 %”,而0和100则分别代表小进度和大进度的值,之后我们用一个循环来测试这个进度条函数的功能,其中info表面不同时刻进度条打印的信息,setTkProgressBar则可以对我们之前创建的progressBar进行设置。
整段代码比较简单,大家再循环里可以直接拷贝,不会影响其他的函数运行,其效果大致是如下图所示:
tcltk2包
目前,还有一个新的包,叫做tcltk2,也可以是实现上述的功能,具体测试代码如下。可以更详细的设置进度栏的大小等属性值:
library(tcltk)
library(tcltk2)
root <- tktoplevel()
l1 <- tk2label(root)
pb1 <- tk2progress(root, length = 300)
tkconfigure(pb1, value = 0, maximum = 9)
tkgrid(l1, row = 0)
tkgrid(pb1, row = 1)
for (index in 1:10){
tkconfigure(l1, text = paste("Index", index))
tkconfigure(pb1, value = index - 1)
Sys.sleep(1)
}
说在后面
更多内容请关注我的专栏:R语言与数据挖掘 - 知乎专栏
或者关注我的知乎账号:温如
对量化交易(投资)感兴趣的也可以关注专栏:清华大学量化投资协会成果集萃 - 知乎专栏