2015-05-23 26 views
2

我在R中执行两个循环:外部的是超过5个目录,内部的是在每个目录中存在的15个文件。R - 如何在嵌套循环中显示进度?

我的问题是:如何在这种情况下显示任务的进度?

请看下面的例子:

# 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个文件中的每一个文件的进度。

但是,我想不出在嵌套循环中这样做的方法。有人有什么主意吗?

+1

嵌套循环的问题究竟是什么?你是否很难计算出迭代的总数? – MrFlick

+0

@MrFlick我添加了原文,添加了一个具体的例子。重点是我只在第一次循环中输入后才知道迭代的总次数。希望现在很容易看到它。 – thiagoveloso

回答

2

如果每个目录有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) 
+0

真的很整洁!谢谢。 – thiagoveloso