web-dev-qa-db-fra.com

R: Barre de progression du texte dans la boucle for

J'ai un exemple de code qui contient une boucle for et crée des tracés comme celui-ci (mes données réelles créent plusieurs milliers de tracés):

xy <- structure(list(NAME = structure(c(2L, 3L, 1L, 1L), .Label = c("Cisco","JOHN", "STEPH"), class = "factor"), ID = c(41L, 49L, 87L, 87L), X_START_YEAR = c(1965L, 1948L, 1959L, 2003L), Y_START_VALUE = c(940L,-1760L, 110L, 866L), X_END_YEAR = c(2005L, 2000L, 2000L, 2007L), Y_END_VALUE = c(940L, -1760L, 110L, 866L), LC = structure(c(1L,1L, 2L, 2L), .Label = c("CA", "US"), class = "factor")), .Names = c("NAME", "ID", "X_START_YEAR", "Y_START_VALUE", "X_END_YEAR", "Y_END_VALUE","LC"), class = "data.frame", row.names = c(NA, -4L))

ind <- split(xy,xy$ID) # split by ID for different plots

# Plots
for (i in ind){
  xx = unlist(i[,grep('X_',colnames(i))])
  yy = unlist(i[,grep('Y_',colnames(i))])    
  fname <- paste0(i[1, 'ID'],'.png')
  png(fname, width=1679, height=1165, res=150)
  par(mar=c(6,8,6,5))
  plot(xx,yy,type='n',main=unique(i[,1]), xlab="Time [Years]", ylab="Value [mm]") 
  i <- i[,-1]
  segments(i[,2],i[,3],i[,4],i[,5],lwd=2)
  points(xx, yy, pch=21, bg='white', cex=0.8)
  dev.off()
} 

Pour voir la progression de la boucle for, je serais intéressé à incorporer une barre de progression à mon code. Comme je l'ai trouvé dans la documentation R, il y a le txtProgressBarhttp://stat.ethz.ch/R-manual/R-patched/library/utils/html/txtProgressBar.html À partir de l'exemple de cette page, je comprends que vous devez écrire la boucle for dans une fonction pour l'appeler ensuite, ce que je lutte avec mon exemple.

Comment pourrais-je implémenter une barre de progression dans la boucle for?

21
kurdtc

pour que la barre de progression fonctionne, vous avez besoin d'un numéro pour suivre vos progrès. c'est l'une des raisons pour lesquelles je préfère en règle générale utiliser avec (i in 1:length(ind)) au lieu de mettre directement l'objet que je veux là. Sinon, vous allez simplement créer une autre variable stepi que vous faites stepi = stepi + 1 à chaque itération.

vous devez d'abord créer l'objet progressbar en dehors de la boucle

pb = txtProgressBar(min = 0, max = length(ind), initial = 0) 

à l'intérieur, vous devez mettre à jour à chaque itération

setTxtProgressBar(pb,stepi)

ou

setTxtProgressBar(pb,i)

Cela fonctionnera mal si la boucle contient également des commandes print

25
OganM

Vous pouvez en écrire un très simple à la volée pour afficher le pourcentage achevé:

n <- 100
for (ii in 1:n) {
  cat(paste0(round(ii / n * 100), '% completed'))
  Sys.sleep(.05)
  if (ii == n) cat(': Done')
  else cat('\014')
}
# 50% completed

Ou un pour répliquer la barre de texte:

n <- 100
for (ii in 1:n) {
  width <- options()$width
  cat(paste0(rep('=', ii / n * width), collapse = ''))
  Sys.sleep(.05)
  if (ii == n) cat('\014Done')
  else cat('\014')
}
# ============================
9
rawr