0

編集1:私はWindowsVistaとR2.12.1を使用しています

maptoolsパッケージのspplotを使用して84のマップをプロットしています。私は2つのビューポートを使用しています。1つはマップをプロットするためのもので、もう1つは時間の経過に伴う傾向をプロットするためのものです。データの各サブセットを調べ、スコアに従って色分けされた国でマップをプロットし、反復にわたるそのスコアの傾向をプロットするループを作成しました。ループは次のようになります。

##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
 }
}

問題は、Rが8回の反復後にクラッシュすることです。どういうわけか、大量のメモリを使い果たしているのではないかと思いますが、実際に何が起こっているのかわかりません。

EDIT2:次のようなWindowsエラーメッセージが表示されます(Germahnから翻訳):RforWindowsフロントエンドが機能しなくなりました

EDIT3:Windowsタスクマネージャーからメモリ使用量を監視してきましたが、8回の反復の後、メモリはほぼ完全に使い果たされています。

EDIT4:異なるグラフィックデバイス(png、jpeg、pdf)を使用すると同じエラーが発生します。ビューポートを使用せずにループを実行できたので、これはビューポートに関連していると思われます。

最高、トーマス

4

1 に答える 1

2

小さなシェープファイルでは機能するが、大きなシェープファイルでは機能しない場合(そして48Mbは大きなシェープファイル)、そうです、それはメモリになります。私が時々役立つのを見た1つのことは、ループ内のすべてを関数に固定することです。そのため、ファイルは次のようになります。

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

doit()を呼び出すたびに、多くのことがスコープ外になり、ガベージコレクションが行われることを願っています。このトリックがR(およびSplus)の初期バージョンで機能したことは知っていますが、おそらくそれはすべて修正されています。プロセスの使用状況を把握するには、メモリに関連するR関数のいくつかを確認してください。これはWindowsですか、それともUnixですか?

于 2011-01-17T12:39:46.997 に答える