Как уменьшить время выполнения в коде R, используя для циклов - PullRequest
0 голосов
/ 29 марта 2019

код предназначен для чтения нескольких дней в определенное время года и сохранения климатических переменных в массиве. выбор дня основан на другом файле, то есть дате посева. код работает, но занимает неожиданно много времени. Я должен запустить этот код 156 раз. Любая помощь для запуска этого кода в короткие сроки приветствуется, пожалуйста. код приведен ниже с комментариями:

#Defining an array
prec<-array(0,dim=dim(frac)) # dim(frac) =  377 175  30
#Loop over years 
for (year in c(2:30)) #first year not included because growing season might have started in year 0 (e.g. in winter crop)
{
  print(year+1980) 
# Reading input precipitation files
  inputprec.file<-paste("E:/Paper_2018/Prec/","prec_",1980+year,".nc",sep="")
  inputprec.file.previous<-paste("E:/Paper_2018/Prec/","prec_",1980+year-1,".nc",sep="")

  nc<-nc_open(inputprec.file)
  lons.inp<-ncvar_get(nc,"longitude")
  lats.inp<-ncvar_get(nc,"latitude")
  val<-ncvar_get(nc,"pr")
  nc_close(nc)

# to select exactly the same doamains for the input from files cftfrac and inputprec.file

  xmin<-which(abs(lons.inp-min.lon)<0.01)
  xmax<-which(abs(lons.inp-max.lon)<0.01)
  ymin<-which(abs(lats.inp-min.lat)<0.01)
  ymax<-which(abs(lats.inp-max.lat)<0.01) 

  val<-val[xmin:xmax,ymin:ymax,]

  nc<-nc_open(inputprec.file.previous)
  val.previous<-ncvar_get(nc,"pr")
  nc_close(nc)

  val.previous<-val.previous[xmin:xmax,ymin:ymax,]

# Loopf over length of x and y

  for(x in c(1:377))
    for (y in c(1:175))

    {
      if(!is.na(hdate[x,y,year])) #get rid of excess NAs
        if(hdate[x,y,year]>0) # condition to check if hdate >0
        {
          if(hdate[x,y,year]>sdate[x,y,year]) # if hdat>sdate i.e. kharif season run this part of code otherwise go to else condition
          {
          #condition over 3rd dimention of sdate to slected few days after sowing
            counter=sdate[x,y,year]
            while (counter <= sdate[x,y,year]+29) {
              print(counter)
              counter=counter+1
            }

            prec[x,y,year]<-sum(val[x,y,sdate[x,y,year]:counter])


          }else # if hdat< sdate i.e. rabi season run this part of code 
          {
            #condition over 3rd dimention of sdate to slected few days after sowing 
            counter=sdate[x,y,year-1]
            while (counter <= sdate[x,y,year-1]+59) {
              print(counter)
              counter=counter+1
            }

            prec[x,y,year]<-sum(val.previous[x,y,sdate[x,y,year-]:counter])

           }
        }
    }
} # end of loop over years
...