R语言中的进度条

文摘   科学   2022-05-20 21:38   英国  


如果你的R代码或脚本中有很多for循环,那么在执行过程中,如果能够将这些for循环的进度展示出来,会使你的代码变得很友好。可以根据进度来安排自己的时间,不需要在电脑前等待执行完成。

很久之前,学习过如何在Python中进度条,【链接如下】

Python中如何显示程序进度

本文来研究一下如何在R语言中加入进度条。

  1. 数字进度提示

只将进度的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!


  1. 图形进度显示

可以自定义进度显示符号,甚至可以使用表情包作为进度条显示。

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




  1. 使用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%)



  1. 使用操作系统进度显示

如果你是在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平台上,也可以使用tcltkR包来调用系统进度条,其用法和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/


AI写代码的DNA
我的群体进化遗传学 学习笔记~~~ 学习|交流|进步