Question

EDIT1: I am using windows Vista and R 2.12.1

I am plotting 84 maps with spplot from the maptools package. I am using two viewports, one to plot the map, and one to plot a trend over time. I have written a loop which goes through each subset of the data, plots the map with countries color coded according to their scores, and plots the trend in that score over iterations. The loop looks like this:

##Read in the shape file, it is 48mb
eu27 <- readShapeSpatial("C:/Users/Thomas/Documents/EU27_shapefile/eu27_cyp.shp",proj4string=CRS     ("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"))

##Drop not used variables from the shapefile data table
eu27@data <- data.frame(Order = 1:dim(eu27)[1], Country = as.character(eu27@data[,c("NAME_ISO")]))

##Fix longitude and lattitude for plotting later
xl <- c(-15,36) 
yl <- c(33,73)

##Set the directory for storing the plots
setwd("C:/Users/Thomas/Documents/maps/")

##Define the breaks and  colors
brks <- seq(0,8,1)
colcode <- terrain.colors(length(brks))

##Count used in the loop to keep track of iterations
count <- 1

##Vector to store the trend in time
total <- vector()

##Beginning of loop
for(i in 2001:2003){
 for(j in 1:12){
                ##Subset the data and merge it with the shape file data table
  dat <- d3[d3$Year == i & d3$Month == j, c("No","No.Neg","Country")]
  eu27dat <- merge(eu27@data,dat, by="Country", all.x=TRUE)
  eu27@data <- eu27dat[order(eu27dat$Order),]
  eu27@data$tot <- eu27@data$No + eu27@data$No.Neg

                ##Store the map plot with countries color coded in the plot1 object
  plot1 <- spplot(eu27, "tot", main = paste("Year: ",i,", Month: ",j, sep = ""), xlim=xl, ylim=yl, at = brks, col.regions = colcode)

                ##Remove the variables created
  eu27@data$No <- NULL
  eu27@data$No.Neg <- NULL
  eu27@data$tot <- NULL

                ##Update the vector with trend data from the current iteration
  total[count] <- sum(dat$No.Neg, na.rm = T)

                ##Store the trend data plot in the plot2 object
  plot2 <-xyplot(total ~ 1:length(total), type = "b", xlab = "Time", ylab = "No Votes", ylim = c(-1,4))

                ##Open a PNG device
  png(file = paste("mapNo",count,".png", sep = ""),width=20, height=12, units="cm",bg="white", pointsize=20, res=300)

                ##Create two viewports for the two plots created above
  pushViewport(viewport(layout = grid.layout(1, 2, unit(c(2, 1), "null"))))

                ##Print plot1 in the first viewport
  pushViewport(viewport(layout.pos.col = 1, layout.pos.row = 1)) 
  print(plot1, newpage = F) 
  upViewport() 

                ##Print plot2 in the second viewport
  pushViewport(viewport(layout.pos.col = 2, layout.pos.row = 1)) 
  print(plot2, newpage = F) 
  upViewport()

                ##Close the device
  dev.off()

                ##Update the count
  count <- count + 1
 }
}

The problem is that R crashes after 8 iterations, I suspect that somehow I am using up huge amounts of memory, but I really have no idea of what is going on.

EDIT2: I get a windows error message which says (translated from Germahn): The R for Windows front-end does not function any more

EDIT3: I have been monitoring the memory use from the windows task manager, and after 8 iterations the memory is almost used up completely.

EDIT4: I get the same error when using different graphics devices (png, jpeg, pdf). I was able to run the loop without using the viewports, so I am suspecting that this is related to the viewports.

Best, Thomas

Was it helpful?

Solution

If it works with a small shapefile, but not with a large one (and 48Mb is a large one) then yes, it will be memory. One thing I've seen sometimes help is to stick everything in a loop into a function, so your file looks like this:

for(i in 2001:2003){
 for(j in 1:12){
   doit(i,j,[etc])
  }
}

After each call to doit() lots of things will hopefully be going out of scope and thus garbage collected. I know this trick worked with early versions of R (and Splus) but maybe that's all been fixed now. Check out some of R functions related to memory to get a handle on your process usage. Is this Windows or Unix?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top