[R-sig-Geo] while loop help: SOLVED

Takatsugu Kobayashi tkobayas at indiana.edu
Sat Jan 26 06:24:01 CET 2008


I figured it out. Thanks for taking a look. thanks

Takatsugu Kobayashi wrote:
> Hi, I must apologize both for this lengthy thread and for posting a 
> thread based on the same example I have been using. 
>
> I successfully created a code that re-arrange 10*10 grid cells of the 
> same size into new grid cells of varying sizes.  Now I am attempting to 
> create grid cells of the same size that are larger than the orignal 
> 10*10 grid cells, which means the total number of cells is a lot less 
> than 100.  So If I would like to re-arrange a 10*10 grid cells by 
> combining 4 cells, the number of new grid cells will be 25.
>
> The function I created below stops with errors. It stops when a single 
> cell is isolated after its cell's 1st order nearest neighbors are 
> already taken.  I guess I could come up with a mathematical way of 
> avoiding it, but I just wanted to loop it until no single cells are 
> isolated, which means all new cells have the size equal to n.nb (the 
> number of cells to be combined).
>
> I would like to use the function below in a while loop or repeat loop, 
> and when single cells are isolated I want to tell a code to start over 
> the while loop from the beginning.  Because when I set the number of 
> cells to be combined to 4, there are 25 sets of new grid cells (100/4), 
> I know there is a solution rather than a code being trapped in an 
> infinite looping.
>
> So my question is how can I set up a code such that it starts over when 
> errors occur?
>
> Again, I am sorry for this lengthy thread. 
>
> Thank you.
>
> Taka
>
> ### Include necessary packages
> library(sp)
> library(maptools)
> library(PBSmapping)
>
>
> ### Define parameters for a grid
> start.point <- -0
> cco <- c(start.point,start.point)
> csize <- c(1,1)
> n <- 10 #abs(cco[1]*2)+1
> cnum <- c(n,n)
> grd <- GridTopology(cco, csize, cnum)
> r.grd <- as(grd, "SpatialPolygons")
> r.grd.ps <- SpatialPolygons2PolySet(r.grd)
>
>
> ### Subset the grid into n*n single cells
> ### I use r.grd.ps over r.grd because I did not know how to clip out 
> Slot "coords" from SpatialPolygons
> ### I tried lapply(slot(r.grd, "polygons"), function(x) slot(x, 
> "coords")), but cannot obtain this slot
>
> subPoly <- list()
> coords <- list()
> for (i in 1:n^2)
>  {
>   beg <- 5*i-4; end <- 5*i
>   sP <- r.grd.ps[beg:end,]
>   subPoly[[i]] <- sP
>   cds <- calcCentroid(sP)
>   coords[[i]] <- cbind(cds$X, cds$Y)
>  }
>
>
> ### 1st order continuity neighbors
> knn.nb <- list()
> res <- vector("numeric",length=n^2)
>
> for (ki in 1:n^2)
>  for (ji in 1:n^2)
>   {{
>    ## Find the cells whose boundaries share with jth cell
>    res[ji] <- 
> length(which(subPoly[[ki]][1:4,4]%in%subPoly[[ji]][1:4,4]&subPoly[[ki]][1:4,5]%in%subPoly[[ji]][1:4,5]))  
>
>    res[ki] <- 0
>    ## Identify which cells are k-nearest neighbors excluding the 
> reference zone
>    knn.nb[[ki]] <- which(res>1)  
>   }}
>
>
> ### Clip individual polygons and merge some of them based on adjacency 
> weights
> ## Fixed number of cells to be combined excluding the jth cell
> n.nb <- 3
>
> maup <- function (knn.nb, n.nb)
> {
> ## j for subPoly ID: input
> j <- 1
> ## k for randomPoly ID: output
> k <- 1
> ## A vector of subPoly IDs
> sample.cell <- 1:n^2
> ## A list in which to store combined Polygons
> randomPoly <- list()
> ## A vector of cell areas: for making sure all cells have the size of 
> n.nb =4
> areaPoly <-numeric(n^2/n.nb)
>
>   while (all(areaPoly != n.nb))
>         {
>          ## Retrieve at most 5 contiguous neighbors
>          j <- min(which(!is.nan(sample.cell)))
>  
>          ## Pick one nearest neighbor of jth cell randomly, including 
> the jth cell
>          d1.id <- which(!is.nan(knn.nb[[j]]))
>          d1 <- knn.nb[[j]][d1.id]
>          d1.rand <- round(runif(1,0.5,length(d1)))
>          d1 <-  d1[d1.rand]
>          nb.list <- append(j, d1)
>
>          for (k.nb in 2:n.nb)
>              {
>               ## Pick one nearest neighbor of j+1th cell randomly
>               ## Repeat till n.nb and append every cells chosen
>               ## d as nearest neighbors
>               d_id <- nb.list[k.nb]
>               d_k_id <- which(!is.nan(knn.nb[[d_id]]))
>               d_k <- knn.nb[[d_id]][d_k_id]
>               non_overlap_id <- which(d_k%in%nb.list)
>               d_k <- d_k[-non_overlap_id]
>               dk.rand <- round(runif(1,0.5,length(d_k)))
>               dk <- d_k[dk.rand]
>               nb.list <- append(nb.list, dk)
>              }
>
>         ## Remove cells that are already taken
>         sample.cell[nb.list] <- NaN
>    
>         for (ord in 1: n^2)
>             {
>              id.check <- which(knn.nb[[ord]]%in%nb.list)
>              if (length(id.check)>0)
>                 {  
>                 knn.nb[[ord]][id.check] <- NaN
>                 }   
>             }
>
>
>         ## JoinPolys allows to join two of the same polysets
>         joinedPoly <- joinPolys(subPoly[[j]],subPoly[[nb.list[2]]],"UNION")
>    
>         for (pl in 3:(n.nb+1)) # +1 means the jth cell
>             {      
>              joinedPoly <- 
> joinPolys(joinedPoly,subPoly[[nb.list[pl]]],"UNION")       
>             }
>
>         ## PID should be single and unique
>         randomPoly[[k]] <- combinePolys(joinedPoly)
>         randomPoly[[k]]$PID <- k
>
>       areaPoly[k] <- calcArea(randomPoly[[k]])[,3]
>  
>       k <- k+1
>       }
> }
>
> _______________________________________________
> R-sig-Geo mailing list
> R-sig-Geo at stat.math.ethz.ch
> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>




More information about the R-sig-Geo mailing list