2015-05-23 3 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

Смежные вопросы