[R] using loops to create multiple images

Jeffrey Horner jeff.horner at vanderbilt.edu
Sun Aug 5 06:05:22 CEST 2007


Donatas G. wrote:
> I have a data.frame with ~100 columns and I need a barplot for each column 
> produced and saved in some directory.
> 
> I am not sure it is possible - so please help me.
> 
> this is my loop that does not work...
> 
> vars <- list (substitute (G01_01), substitute (G01_02), substitute (G01_03), 
> substitute (G01_04))
> results <- data.frame ('Variable Name'=rep (NA, length (vars)), 
> check.names=FALSE)
> for (i in 1:length (vars))  {
> barplot(table(i),xlab=i,ylab="Nuomonės")
> dev.copy(png, filename="/my/dir/barplot.i.png", height=600, width=600)
> dev.off()
> }
> 
> questions: 
> 
> Is it possible to use the i somewhere _within_ a file name? (like it is 
> possible in other programming or scripting languages?)

Oh yes, very easy. two options:

1) Use sprintf, e.g. filename=sprintf("/my/dir/barplot.%d.png",i)
2) Use paste, i.e., filename=paste('/my/dir/barplot.',i,'.png',sep='')

> Since I hate to type in all the variables (they go from G01_01 to G01_10 and 
> then from G02_01 to G02_10 and so on), is it possible to shorten this list by 
> putting there another loop, applying some programming thing or so? 

Well sure! Just loop over each column of your data frame. The column 
names are gotten from the names() function. I don't see a data frame in 
your code so I assume d is below:

for (i in names(d)){
	barplot(d[,i],filename=sprintf("/my/dir/barplot.%s.png",i))
}

Notice that names(d) returns a character vector, thus i is a string, 
whereas in my sprintf example in 1) presumed it an int. Also, be sure to 
read up on the apply family of functions as an alternative to using 
loops in R code.

Jeff
-- 
http://biostat.mc.vanderbilt.edu/JeffreyHorner



More information about the R-help mailing list