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

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top