R se bloquea al trazado de archivos de formas
Pregunta
EDIT1: Estoy utilizando Windows Vista y R 2.12.1
Estoy tramando 84 mapas con spplot del paquete MapTools. Estoy usando dos ventanas, una para trazar el mapa, y uno para trazar una tendencia en el tiempo. He escrito un bucle que pasa a través de cada subconjunto de los datos, traza el mapa con los países codificados por colores de acuerdo a sus calificaciones, y las parcelas en que la tendencia puntuación de más iteraciones. El aspecto de bucle como este:
##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
}
}
El problema es que R se bloquea después de 8 iteraciones, sospecho que de alguna manera estoy usando enormes cantidades de memoria, pero realmente no tengo idea de lo que está pasando.
Edit2: me sale un mensaje de error de Windows que dice (traducido del Germahn): El R para el front-end de Windows no funciona más
Edit3: He estado monitoreando el uso de memoria desde el administrador de tareas de Windows, y después de 8 iteraciones la memoria está casi agotada por completo.
EDIT4: Me sale el mismo error cuando se utilizan dispositivos gráficos diferentes (PNG, JPEG, PDF). Yo era capaz de ejecutar el bucle sin necesidad de utilizar los puertos de vista, por lo que estoy sospechando que esto está relacionado con los puertos de vista.
Best, Thomas
Solución
Si funciona con un pequeño archivo de forma, pero no con una grande (y 48Mb es grande) entonces sí, será la memoria. Una cosa que he visto en ocasiones ayuda es pegarse todo en un bucle en una función, por lo que su apariencia de archivo como este:
for(i in 2001:2003){
for(j in 1:12){
doit(i,j,[etc])
}
}
Después de cada llamada a doit () un montón de cosas de esperar que se va fuera del alcance y de este modo basura recogida. Sé que este truco trabajado con las primeras versiones de R (y Splus) pero tal vez que todo ha sido arreglado ahora. Echa un vistazo a algunas de las funciones de investigación relacionados con la memoria a conseguir una manija en su uso de proceso. Es esto Windows o Unix?