R - 如何在嵌套循环中显示进度?
R - How to show progress in nested loops?
我在 R 中执行两个循环:外部循环超过 5 个目录,内部循环超过每个目录中存在的 15 个文件。
我的问题是:这个场景下任务的进度如何显示?
请看下面的例子:
# these are the directories
vars <- c("clt", "hurs", "pr", "tas", "was")
# prepare progress info
pb <- txtProgressBar(min = 0, max = length(vars), style = 3)
# first, loop through variables
for (i in 1:length(vars)){
# do some stuff here: each file takes a bit long to finish
files <- c("was_Amon_CanESM2_historical_r1i1p1_185001-200512.nc", "was_Amon_CanESM2_historical_r1i1p1_185001-200512_SA.nc",
"was_Amon_GFDL-ESM2M_historical_r1i1p1_186101-200512.nc", "was_Amon_GFDL-ESM2M_historical_r1i1p1_186101-200512_SA.nc",
"was_Amon_GISS-E2-H_historical_r1i1p1_185001-200512.nc", "was_Amon_GISS-E2-H_historical_r1i1p1_185001-200512_SA.nc",
"was_Amon_GISS-E2-R-CC_historical_r1i1p1_185001-201012.nc", "was_Amon_GISS-E2-R-CC_historical_r1i1p1_185001-201012_SA.nc",
"was_Amon_GISS-E2-R_historical_r1i1p1_185001-200512.nc", "was_Amon_GISS-E2-R_historical_r1i1p1_185001-200512_SA.nc",
"was_Amon_HadGEM2-AO_historical_r1i1p1_186001-200512.nc", "was_Amon_HadGEM2-AO_historical_r1i1p1_186001-200512_SA.nc",
"was_Amon_HadGEM2-CC_historical_r1i1p1_185912-200511.nc", "was_Amon_HadGEM2-CC_historical_r1i1p1_185912-200511_SA.nc",
"was_Amon_IPSL-CM5A-MR_historical_r1i1p1_185001-200512.nc", "was_Amon_IPSL-CM5A-MR_historical_r1i1p1_185001-200512_SA.nc",
"was_Amon_IPSL-CM5B-LR_historical_r1i1p1_185001-200512.nc", "was_Amon_IPSL-CM5B-LR_historical_r1i1p1_185001-200512_SA.nc",
"was_Amon_MIROC4h_historical_r1i1p1_195001-200512.nc", "was_Amon_MIROC4h_historical_r1i1p1_195001-200512_SA.nc",
"was_Amon_MRI-CGCM3_historical_r1i1p1_185001-200512.nc", "was_Amon_MRI-CGCM3_historical_r1i1p1_185001-200512_SA.nc",
"was_Amon_NorESM1-M_historical_r1i1p1_185001-200512.nc", "was_Amon_NorESM1-M_historical_r1i1p1_185001-200512_SA.nc",
"was_Amon_bcc-csm1-1-m_historical_r1i1p1_185001-201212.nc", "was_Amon_bcc-csm1-1-m_historical_r1i1p1_185001-201212_SA.nc",
"was_Amon_bcc-csm1-1_historical_r1i1p1_185001-201212.nc", "was_Amon_bcc-csm1-1_historical_r1i1p1_185001-201212_SA.nc",
"was_Amon_inmcm4_historical_r1i1p1_185001-200512.nc", "was_Amon_inmcm4_historical_r1i1p1_185001-200512_SA.nc"
)
# loop through files
for (j in files){
# do some stuff here too
# inform progress on files
Sys.sleep(0.05)
setTxtProgressBar(pb, i)
}
}
我在这里只显示每个目录的进度。但是,由于处理目录中的所有文件需要很长时间,所以我更愿意显示 75 个文件中每个文件的进度。
但是,我想不出在嵌套循环中执行此操作的方法。有人知道吗?
如果每个目录有15个文件,设置进度条的最大值为length(var)*15
。然后设置一个计数器k
,它会在每个文件后递增:
#outside both loops
pb <- txtProgressBar(min = 0, max = length(vars)*15, style = 3)
k<-0
#inside the j loop just before the progress bar:
k<-k+1
setTxtProgressBar(pb, k)
我在 R 中执行两个循环:外部循环超过 5 个目录,内部循环超过每个目录中存在的 15 个文件。
我的问题是:这个场景下任务的进度如何显示?
请看下面的例子:
# these are the directories
vars <- c("clt", "hurs", "pr", "tas", "was")
# prepare progress info
pb <- txtProgressBar(min = 0, max = length(vars), style = 3)
# first, loop through variables
for (i in 1:length(vars)){
# do some stuff here: each file takes a bit long to finish
files <- c("was_Amon_CanESM2_historical_r1i1p1_185001-200512.nc", "was_Amon_CanESM2_historical_r1i1p1_185001-200512_SA.nc",
"was_Amon_GFDL-ESM2M_historical_r1i1p1_186101-200512.nc", "was_Amon_GFDL-ESM2M_historical_r1i1p1_186101-200512_SA.nc",
"was_Amon_GISS-E2-H_historical_r1i1p1_185001-200512.nc", "was_Amon_GISS-E2-H_historical_r1i1p1_185001-200512_SA.nc",
"was_Amon_GISS-E2-R-CC_historical_r1i1p1_185001-201012.nc", "was_Amon_GISS-E2-R-CC_historical_r1i1p1_185001-201012_SA.nc",
"was_Amon_GISS-E2-R_historical_r1i1p1_185001-200512.nc", "was_Amon_GISS-E2-R_historical_r1i1p1_185001-200512_SA.nc",
"was_Amon_HadGEM2-AO_historical_r1i1p1_186001-200512.nc", "was_Amon_HadGEM2-AO_historical_r1i1p1_186001-200512_SA.nc",
"was_Amon_HadGEM2-CC_historical_r1i1p1_185912-200511.nc", "was_Amon_HadGEM2-CC_historical_r1i1p1_185912-200511_SA.nc",
"was_Amon_IPSL-CM5A-MR_historical_r1i1p1_185001-200512.nc", "was_Amon_IPSL-CM5A-MR_historical_r1i1p1_185001-200512_SA.nc",
"was_Amon_IPSL-CM5B-LR_historical_r1i1p1_185001-200512.nc", "was_Amon_IPSL-CM5B-LR_historical_r1i1p1_185001-200512_SA.nc",
"was_Amon_MIROC4h_historical_r1i1p1_195001-200512.nc", "was_Amon_MIROC4h_historical_r1i1p1_195001-200512_SA.nc",
"was_Amon_MRI-CGCM3_historical_r1i1p1_185001-200512.nc", "was_Amon_MRI-CGCM3_historical_r1i1p1_185001-200512_SA.nc",
"was_Amon_NorESM1-M_historical_r1i1p1_185001-200512.nc", "was_Amon_NorESM1-M_historical_r1i1p1_185001-200512_SA.nc",
"was_Amon_bcc-csm1-1-m_historical_r1i1p1_185001-201212.nc", "was_Amon_bcc-csm1-1-m_historical_r1i1p1_185001-201212_SA.nc",
"was_Amon_bcc-csm1-1_historical_r1i1p1_185001-201212.nc", "was_Amon_bcc-csm1-1_historical_r1i1p1_185001-201212_SA.nc",
"was_Amon_inmcm4_historical_r1i1p1_185001-200512.nc", "was_Amon_inmcm4_historical_r1i1p1_185001-200512_SA.nc"
)
# loop through files
for (j in files){
# do some stuff here too
# inform progress on files
Sys.sleep(0.05)
setTxtProgressBar(pb, i)
}
}
我在这里只显示每个目录的进度。但是,由于处理目录中的所有文件需要很长时间,所以我更愿意显示 75 个文件中每个文件的进度。
但是,我想不出在嵌套循环中执行此操作的方法。有人知道吗?
如果每个目录有15个文件,设置进度条的最大值为length(var)*15
。然后设置一个计数器k
,它会在每个文件后递增:
#outside both loops
pb <- txtProgressBar(min = 0, max = length(vars)*15, style = 3)
k<-0
#inside the j loop just before the progress bar:
k<-k+1
setTxtProgressBar(pb, k)