I have some sample code which contains a for loop and creates some plots like this (my actual data creates several thousands of plots):
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()
}
To see the progress of the for loop I would be interested to incorporate a progress bar to my code. As I found from the R documentation there is the txtProgressBar
http://stat.ethz.ch/R-manual/R-patched/library/utils/html/txtProgressBar.html
From the example of that page I understand that you have to write the for loop into a function to call it afterwards which I am struggling with my example.
How could I implement a progress bar into the for loop?
You could write a very simple one on the fly to show percent completed:
Or one to replicate the text bar:
for progress bar to work you need a number to track your progress. that is one of the reasons as a general rule I prefer using for with
(i in 1:length(ind))
instead of directly putting the object I want there. Alternatively you'll just create anotherstepi
variable that you dostepi = stepi + 1
in every iteration.you first need to create the progressbar object outside the loop
then inside you need to update with every iteration
or
This will work poorly if the loop also has
print
commands in it