R语言—添加程序运行的进度条

循环是在处理各种任务的最常用的结构,一般的少量数据循环过程可以在几秒之内完成,稍大一点的也就是分钟的事情,但是在处理大量数据的时候,这个循环就可能会运行小时甚至几天的时间(当然还是要看配置和代码质量的)。
  在这种情况下,程序的运行就变成了一种毫无目的的等待,看不见摸不着的运行,就算是其中除了bug卡在了某处,也只能痴痴地等了……这个等待的过程太煎熬了,最关键的是我们不知道现在已经完成了多少进度,从而决定是否停止重新修改代码。
  这个时候我们就可以在程序中添加进度条,能够让我们更直观的看到程序运行进度,顺便安排一下时间,吃个饭看个电影什么的^ _ ^,因此在大数据中使用循环是一个非常明智的选择。现实进度的有很多种方法,这里总结一下两种弹出和不弹出进度条的使用方法:

第一种:tcltk包(弹出窗口)

使用这个包会弹出一个进度条窗口,能够显示程序运行的进度,类似这样的弹出窗口 。
R语言—添加程序运行的进度条_第1张图片

使用这个包一般需要分别放在三个地方:①循环之前;②循环中;③循环结束之后。先上代码再解释:


## 第一个位置:新建一个其实进度条弹窗
pb <- tkProgressBar("进度","已完成 %", 0, 100) 

star_time <- Sys.time() ## 记录程序开始时间

for (i in 1:nrow(my_data)){
    …… ## 循环的主体
    ## 第二个位置:实时反映进度
    info <- sprintf("已完成 %d%%", round(i*100/nrow(my_data)))  ## 设置进度条的完成度
    setTkProgressBar(pb, i*100/nrow(my_data), sprintf("进度 (%s)", info),info)  ## 设置进度条
}

end_time <- Sys.time()  ## 记录程序结束时间

## 第三个位置关闭进度条  
close(pb)  

run_time <- end_time - star_time  ## 计算程序运行时间

第一个位置
  在程序循环的外面,用来新建一个弹出的起始进度条窗口:
R语言—添加程序运行的进度条_第2张图片

其中的四个常用参数分别为弹出窗的标题,标签和下面进度条的起始数值,一般就这么设计就好了,反正汉字都能读懂。star_rime和end_time以及run_time是用来记录程序运行时间的,不影响进度条。

第二个位置
  在循环中,用来实时显示弹窗上的进度数值。运行的过程就是一直在显示程序的进度了。在程序中的这两行代码的作用分别是:
 
  第一行是用来连接程序运行进度的,是作为第二行代码的引用。其中 i100/nrow(my_data) 就是显示进度百分数,这个结果的解释就是目前循环到的 i 是在总循环次数 nrow(my_data) 中的占比,乘以100是因为我们最后显示的是百分数。sprintf()函数是一个连接函数们用来连接其中的参数,组成我们可以看到的“已完成XX%”。
  第二行是将我们的进度实时地反映到弹出的进度条窗口上,使用setTkProgressBar()函数,其中四个常用参数:第一个参数就是找到我们在起始时设置的弹出窗口;第二个参数是目前的值,就是对应弹出窗口上进度条的值,我们在初始化窗口的时候定义进度条的初始范围为0-100,所以我们使用的值 i
100/nrow(my_data) 就是对应0-100中的进度;第三个是弹出窗口的标题,可以不用设置,也可以设置和下面的进度条同步,也就是会显示“进度(已完成XX%)”这样的标题;第四个是标签选项,我们使用第一行代码生成的变量,就是实时显示在弹出窗的标签上。

第三个位置
  这个位置就一行语句,关闭弹出窗口,程序运行结束之后,这个语句会关闭弹出窗,其实你点弹出窗右上角的叉号也是一样的效果。

:tcltk2包:很明显,这是第一个包的扩展版。与上面的包并无太大区别,可以自由调节弹出窗口的大小等细节参数,但是在window平台下,鼠标拖动就可以实现弹出窗口的位置、大小设置,倒是有些鸡肋了。

第二种:utils包(不弹出窗口)

这个包是Rstudio打开时默认载入的基础包,所以这个的函数以及参数要比上面的稍微简单一些,因为他不用设置标签标题什么的了,他的运行过程就长这样:
在这里插入图片描述


## 第一个位置:新建一个其实进度条
pb <- txtProgressBar(style=3)

star_time <- Sys.time() ## 记录程序开始时间

for (i in 1:nrow(my_data)){
    ……
    ## 第二个位置:实时反映进度
    setTxtProgressBar(pb, i/nrow(my_data))
}

end_time <- Sys.time()  ## 记录程序结束时间

## 第三个位置关闭进度条
close(pb)

run_time <- end_time - star_time  ## 计算程序运行时间

同样也是三个位置,也是同样的功能:新建一个初始进度条,然后实时反映,最后再关闭进度条,唯一的区别就是这个没有弹窗了。
  第一个位置:txtProgressBar()函数,其中的一个style参数取值为1,2,3,其中3是最好看的,所以就用3了;
  第二个位置:setTxtProgressBar()有两个参数,功能就是找到初始进度条然后实时给他进度值,第一个参数就是初始进度条,第二个参数就是实时进度值,也就是循环到哪个变量了,然后除以总变量;
  第三个位置:close()函数关闭这个进度条。

总结:

实现进度条很简单,只要注意两点:一是位置,而是进度值。
  位置:第一个位置的建立初始进度条的函数需要在循环之前,第二个返回实时进度值的函数要在循环之中,第三个关闭的函数要在循环之后。
  进度值:上述示例中的进度值直接就是循环的 i 值除以总值,这是因为循环池里的数据就是按照顺序排列的,如果不是按照顺序排列的话,就需要使用的是当前循环值的位置除以总长度了。根据实际情况,只要是能反映进度即可。

你可能感兴趣的:(R语言作图,经验分享)