第一种:tcltk包(弹出式)
实现逻辑:
- ① 循环之前
- ② 循环中
- ③ 循环结束之后
具体示例
## 第一个位置:新建一个其实进度条弹窗
pb <- tkProgressBar("进度","已完成 %", 0, 100)
star_time <- Sys.time() ## 记录程序开始时间
for (i in 1:nrow(my_data)){
…… ## 循环的主体
## 第二个位置:实时反映进度
info <- sprintf("已完成 %f%%", 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 ## 计算程序运行时间
解释:
第一个位置:
在程序循环的外面,用来新建一个弹出的起始进度条窗口:
其中,四个常用参数分别为
- 弹出窗的标题,
- 标签
- 下面进度条的起始数值
- 下面进度条的结束数值
一般就这么设计就好了,反正汉字都能读懂。star_rime和end_time以及run_time是用来记录程序运行时间的,不影响进度条。
第二个位置:
在循环中,用来实时显示弹窗上的进度数值。运行的过程就是一直在显示程序的进度。在程序中的这两行代码的作用分别是:
- 第一行是用来连接程序运行进度的,是作为第二行代码的引用。其中
i
×
100
/
n
r
o
w
(
m
y
_
d
a
t
a
)
i \times 100 / nrow(my\_data)
i×100/nrow(my_data) 就是显示进度百分数,这个结果的解释就是目前循环到的
i
i
i 是在总循环次数
n
r
o
w
(
m
y
_
d
a
t
a
)
nrow(my\_data)
nrow(my_data) 中的占比,乘以
100
100
100是因为我们最后显示的是百分数。
sprintf()
函数是一个连接函数,用来连接其中的参数,组成我们可以看到的“已完成XX%”。 - 第二行是将我们的进度实时地反映到弹出的进度条窗口上,使用
setTkProgressBar()
函数,其中四个常用参数:- 第一个参数就是找到我们在起始时设置的弹出窗口;
- 第二个参数是目前的值,就是对应弹出窗口上进度条的值(进度条进度),我们在初始化窗口的时候定义进度条的初始范围为0-100,所以我们使用的值 i × 100 / n r o w ( m y _ d a t a ) i\times100/nrow(my\_data) i×100/nrow(my_data) 就是对应0-100中的进度;
- 第三个是弹出窗口的标题,可以不用设置,也可以设置和下面的进度条同步,也就是会显示“进度(已完成XX%)”这样的标题;
- 第四个是标签选项,我们使用第一行代码生成的变量,就是实时显示在弹出窗的标签上(进度条上方的文字描述)。
第三个位置:
这个位置就一行语句,关闭弹出窗口,程序运行结束之后,这个语句会关闭弹出窗,其实你点弹出窗右上角的叉号也是一样的效果。
第二种:基于基础包(utils packages)
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()函数关闭这个进度条。