如果你的R代码或脚本中有很多for循环,那么在执行过程中,如果能够将这些for循环的进度展示出来,会使你的代码变得很友好。可以根据进度来安排自己的时间,不需要在电脑前等待执行完成。
很久之前,学习过如何在Python中进度条,【链接如下】
本文来研究一下如何在R语言中加入进度条。
数字进度提示
只将进度的xx%显示出来, 如下
N <- 100
for(i in 1:N){
cat(paste0(round(i/N*100), '% completed'))
Sys.sleep(0.05)
if(i==N)cat('\nDONE!\n')
else cat('\r')
}
# 100% completed
# DONE!
图形进度显示
可以自定义进度显示符号,甚至可以使用表情包作为进度条显示。
N <- 100
width <- options()$width #获取显示界面行宽度
for(i in 1:N){
cat('[', paste0(rep('#', i/N*width), collapse=''),
paste0(rep('-', width - i/N*width), collapse=''),
']',
round(i/N*100),'%')
Sys.sleep(0.05)
if(i==N)cat('\nDONE!\n')
else cat('\r')
}
# [ ############################## ] 100 %
# DONE!
如下使用表情显示进度, 只不过表情的字符宽度和普通字符不相同,需要做适当调整。同时,在终端中显示表情符也没有在网页中显示的好看。
N <- 100
width <- options()$width #获取显示界面行宽度
for(i in 1:N){
cat('[', paste0(rep('😎', (i/N*width)/4), collapse=''),
paste0(rep('-', (width - i/N*width)/4), collapse=''),
']',
round(i/N*100),'%')
Sys.sleep(0.05)
if(i==N)cat('\nDONE!\n')
else cat('\r')
}
# [ 😎😎😎😎😎😎😎😎😎😎😎😎 ] 100 %
# DONE
使用R包
这儿尝试使用R包progress
来显示程序进度。
【代码块可左右滑动,查看完整进度条样式】
library('progress')
N = 100
pb <- progress_bar$new(total=N)
for(i in 1:N){
pb$tick()
Sys.sleep(0.05)
}
# [==================>-----------------] 50%
progress_bar
属于R语言的R6
类,可以自己创建新的类,以此自定义进度条。【PS:生信三大魔鬼:git, vim 和R语言的面向对象】
比如,我们使用:eta
自定义进度条,使其显示完成当下进度的【预估剩余时间】。
pb <- progress_bar$new(
format = 'Downloading [:bar] :percent eta: :eta',
total = N, clear = FALSE, width = 80
)
for(i in 1:N){
pb$tick()
Sys.sleep(0.05)
}
# Downloading [=======================>---] 80% eta: 2s
我们还可以使用:elapsed
自定义进度条,使其显示进度的【累积消耗时间】。
pb <- progress_bar$new(
format = 'Downloading [:bar] :percent in :elapsed',
total = N, clear = FALSE, width = 80
)
for (i in 1:N){
pb$tick()
Sys.sleep(0.05)
}
# Downloading [=============>----------------] 42% in 3s
同样地,可以在format中使用:current
, :total
,:percent
等关键字来设定进度条显示内容。
pb <- progress_bar$new(
format = '[:bar] :current/:total (:percent)',
total = N, clear = FALSE, width = 80
)
for(i in 1:N){
pb$tick()
Sys.sleep(0.05)
}
# [===========================>-----------] 75/100 ( 75%)
使用操作系统进度显示
如果你是在Windows平台下,可以通过Windows弹出的对话框来显示进度
N = 100
pb <- winProgressBar(title = 'My progress bar',
label = 'Percentage completed',
min = 0,
max = N,
initial = 0,
width = 300L)
for(i in 1:N){
Sys.sleep(0.05)
setWinProgressBar(pb, i, label=paste0(round(i/N*100), '% completed'))
}
close(pb)
如果是在类Unix平台上,也可以使用tcltk
R包来调用系统进度条,其用法和Windows平台类似。如下在Linux平台测试
library(tcltk)
N = 500
pb <- tkProgressBar(title = 'My progress bar',
label = 'Percentage completed',
min = 0,
max = N,
initial = 0,
width = 300L)
for(i in 1:N){
Sys.sleep(0.05)
setTkProgressBar(pb, i, label=paste0(round(i/N*100), '% completed'))
}
close(pb)
总结:
和Python一样,在R语言中,同样有很多方法添加进度条,包括
自定义简单数字或图形进度条 使用 progress
等R语言包显示进度条在Windows或者Unix系统中,调用操作系统进度条
参考资料:
https://stackoverflow.com/questions/26919787/r-text-progress-bar-in-for-loop
https://github.com/r-lib/progress
https://r-coder.com/progress-bar-r/