[R-sig-Geo] lapply and SpatialGridDataFrame

MacQueen, Don macqueen1 at llnl.gov
Wed Jan 30 22:54:13 CET 2013


This should help you get started:

floodfiles <- list.files(pattern=".txt")

maxdepths <- list()
length(maxdepths) <- length(floodfiles)

for(i in seq(along=floodfiles)) {
  cat('-------',i,floodfiles[i],'----------\n')
  maxdepths[[i]] <- readAsciiGrid(floodfiles[i])}

Of course it overwrites. You are assigning the result of readAsciiGrid to
the same object each time.

I believe you would find it helpful to study the basics of R some more.
For example, the difference between [i] and [[i]] is crucial to this
example.

I added the cat() statement so that later on, when something fails as you
loop through the files, it will be obvious which input file had the
problem.

-Don
-- 
Don MacQueen

Lawrence Livermore National Laboratory
7000 East Ave., L-627
Livermore, CA 94550
925-423-1062





On 1/30/13 11:36 AM, "Irucka Embry" <iruckaE at mail2world.com> wrote:

>Hi all, Roger Bivand - thank-you for your assistance.
>
>I have attempted to write a for loop to create an object named maxdepth
>(see str(maxdepth)), but the loop overwrites the previous iteration.
>Although I have 54 files that I will be processing, I am attempting this
>for loop with only the first 2 files. I have searched online for a
>solution to this problem, but I have not been successful in finding one
>yet.
>
>Can someone offer a suggestion on how to fix the problem?
>
>Thank-you.
>
>Irucka Embry
>
>
>library(maptools)
>
>floodfiles <- list.files(pattern=".txt")
>for(i in seq(along=floodfiles)) {
>maxdepth <- readAsciiGrid(floodfiles[i])
>}
>
>str(maxdepth)
>Formal class 'SpatialGridDataFrame' [package "sp"] with 4 slots
>..@ data :'data.frame': 265472 obs. of 1 variable:
>.. ..$ MaxFloodDepth_2.txt: num [1:265472] 0 0 0 0 0 0 0 0 0 0 ...
>..@ grid :Formal class 'GridTopology' [package "sp"] with 3 slots
>.. .. ..@ cellcentre.offset: num [1:2] 356766 3936098
>.. .. ..@ cellsize : num [1:2] 22.9 22.9
>.. .. ..@ cells.dim : int [1:2] 976 272
>..@ bbox : num [1:2, 1:2] 356755 3936087 379079 3942308
>.. ..- attr(*, "dimnames")=List of 2
>.. .. ..$ : NULL
>.. .. ..$ : chr [1:2] "min" "max"
>..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slots
>.. .. ..@ projargs: chr NA
>
>
>
>
>
>
>
>
>
>
><-----Original Message----->
>>From: Roger Bivand [Roger.Bivand at nhh.no]
>>Sent: 1/29/2013 2:07:32 AM
>>To: iruckaE at mail2world.com
>>Cc: r-sig-geo at r-project.org
>>Subject: Re: [R-sig-Geo] lapply and SpatialGridDataFrame
>>
>>On Tue, 29 Jan 2013, Irucka Embry wrote:
>>
>>> Hi Don MacQueen, I want to thank you for your response.
>>>
>>> I received assistance from the main R help mailing list with this
>code
>>> suggestion: maxdepth.plys <- lapply(modeldepthsmore, function(x)
>>> Grid2Polygons(x, level = FALSE)).
>>
>>You posted to the second list when nobody replied within two hours -
>some 
>>of us sleep at some time of the day. The two replies are equivalent,
>and 
>>both indicate that either you didn't read the documentation of lapply,
>or 
>>didn't understand what you read.
>>
>>> I have not allowed that code suggestion or your suggestion to
>complete 
>>> all 54 polygons because it has taken too long. Thus I thought about
>>> revising the code that you provided me to save each polygon to a file
>so 
>>> that I can know which files have been completed and which ones have
>not 
>>> been yet.
>>>
>>
>>Wrong, you mean object, not file. You also need to learn about trapping
>>errors. Simplify what you are doing as a loop, as most of this is
>>confusing because you've written it in a confusing way (don't write a
>>single line function, it is pointless). In addition, you have not said
>>what you are actually doing.
>>
>>You are reading 54 ASCII Grid files into SpatialGridDataFrame objects,
>>then using Grid2Polygons in the Grid2Polygons package to make a simple
>>conversion of each input grid cell (pixel) to a Polygons object. The
>>output SpatialPolygonsDataFrame objects are simple copies of the input,
>so 
>>you do not use the functionality of Grid2Polygons to aggregate to
>blocks 
>>of pixels; you could use coercion in sp instead.
>>
>>However, in your message to R-help, you showed that your goal was to
>use 
>>BayesX. So is your actual aim to stack 54 rasters (possibly 54 time
>>periods???), create a single set of SpatialPolygons, output to
>Shapefile, 
>>read in through the functions in BayesX (which are not based on sp
>classes 
>>- had they been, you wouldn't need to write out and read in again),
>then 
>>run some space-time analysis?
>>
>>Or are the 54 grids all different - in which case get your whole
>workflow 
>>functioning with a single raster first, and then iterate that in a
>loop, 
>>storing results in a list. If your raster has many cells, you may find
>>that the time it takes to run BayesX makes the time taken to convert
>>SpatialGrid -> SpatialPolygons very small, but then again, it could be
>the 
>>use of Grid2Polygons when its advanced features are not needed:
>>
>>> library(Grid2Polygons)
>>> GT <- GridTopology(c(0.5, 0.5), c(1,1), c(100, 100))
>>> SGDF <- SpatialGridDataFrame(GT, data=data.frame(x=runif(10000)))
>>> system.time(G2P <- Grid2Polygons(SGDF, level=FALSE))
>> user system elapsed
>> 36.129 0.832 37.013
>>> system.time(SPDF <- as(SGDF, "SpatialPolygonsDataFrame"))
>> user system elapsed
>> 2.875 0.043 2.945
>>
>>If the SpatialGridDataFrame objects all share the same GridTopology,
>you 
>>should make a single SpatialGridDataFrame in a loop, or a single
>>RasterBrick or RasterStack in the raster package, and go from there.
>But 
>>your proposed workflow is so opaque that helping you fix lapply isn't
>>going to move you forward at all.
>>
>>You must think through your workflow carefully - it is very possible
>that 
>>you can create the BayesX bnd object directly from the GridTopology of
>the 
>>input data, without any intermediate SpatialPolygons objects or
>>shapefiles. The authors of BayesX would have done everyone a big favour
>if 
>>they had supported sp and spacetime classes, for example by coercion -
>>spatstat is a good example of how to use both sp and package-specific
>>classes, and possibly used facilities in sp and spacetime for
>>visualisation.
>>
>>Roger
>>
>>> I have tried to update the previous R code to save each output file
>to a
>>> folder:
>>>
>>> library(maptools)
>>> library(Grid2Polygons)
>>>
>>> readfunct <- function(x)
>>> {
>>> u <- readAsciiGrid(x)
>>> }
>>>
>>> modfilesmore <- paste0("MaxFloodDepth_", 1:54, ".txt")
>>> modeldepthsmore <- lapply(modfilesmore, readfunct)
>>>
>>> myfolder <- paste0("/MaxFloodDepthImages/MaxFloodDepthPolygon_",
>1:54)
>>> maxdepth.plys <- lapply(modeldepthsmore, Grid2Polygons, level=FALSE,
>>> cat, file = "myfolder", append = TRUE)
>>>
>>> Error in FUN(X[[1L]], ...) :
>>> unused argument(s) (file = "myfolder", append = TRUE)
>>>
>>>
>>> <-----Original Message----->
>>>> From: MacQueen, Don [macqueen1 at llnl.gov]
>>>> Sent: 1/28/2013 12:34:56 PM
>>>> To: iruckaE at mail2world.com;r-sig-geo at r-project.org
>>>> Subject: Re: [R-sig-Geo] lapply and SpatialGridDataFrame
>>>>
>>>> I suspect you're not passing arguments correctly to lapply()
>>>>
>>>> I'd try
>>>> maxdepth.plys <- lapply(modeldepthsmore, Grid2Polygons, level=FALSE)
>>>>
>>>> -Don
>>>>
>>>>
>>>>
>>>> --
>>>> Don MacQueen
>>>>
>>>> Lawrence Livermore National Laboratory
>>>> 7000 East Ave., L-627
>>>> Livermore, CA 94550
>>>> 925-423-1062
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On 1/27/13 2:47 AM, "Irucka Embry" <iruckaE at mail2world.com> wrote:
>>>>
>>>>> Hi all, I have a set of 54 files that I need to convert from ASCII
>>> grid
>>>>> format to .shp files to .bnd files for BayesX.
>>>>>
>>>>> I have the following R code to operate on those files:
>>>>>
>>>>> library(maptools)
>>>>> library(Grid2Polygons)
>>>>>
>>>>> readfunct <- function(x)
>>>>> {
>>>>> u <- readAsciiGrid(x)
>>>>> }
>>>>>
>>>>> modfilesmore <- paste0("MaxFloodDepth_", 1:54, ".txt")
>>>>> modeldepthsmore <- lapply(modfilesmore, readfunct)
>>>>>
>>>>> maxdepth.plys <- lapply(modeldepthsmore,
>>> Grid2Polygons(modeldepthsmore,
>>>>> level = FALSE))
>>>>>
>>>>> layers <- paste0("examples/floodlayers_", 1:54)
>>>>> writePolyShape(maxdepth.plys, layers)
>>>>> shpName <- sub(pattern="(.*)\\.dbf", replacement="\\1",
>>>>> x=system.file("examples/Flood/layer_.dbf", package="BayesX"))
>>>>> floodmaps <- shp2bnd(shpname=shpName, regionnames="SP_ID")
>>>>>
>>>>> ## draw the map
>>>>> drawmap(map=floodmaps)
>>>>>
>>>>>
>>>>> This is the error message that I receive:
>>>>>> maxdepth.plys <- lapply(modeldepthsmore,
>>>>> Grid2Polygons(modeldepthsmore, level = FALSE))
>>>>> Error in Grid2Polygons(modeldepthsmore, level = FALSE) :
>>>>> Grid object not of class SpatialGridDataFrame
>>>>>
>>>>>
>>>>> Can someone assist me in modifying the R code so that I can convert
>>> the
>>>>> set of files to .shp files?
>>>>>
>>>>> Thank-you.
>>>>>
>>>>> Irucka Embry
>>>
>>>>> _______________________________________________
>>>>> R-sig-Geo mailing list
>>>>> R-sig-Geo at r-project.org
>>>>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>>>
>>> _______________________________________________
>>> R-sig-Geo mailing list
>>> R-sig-Geo at r-project.org
>>> https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>>>
>>
>>-- 
>>Roger Bivand
>>Department of Economics, NHH Norwegian School of Economics,
>>Helleveien 30, N-5045 Bergen, Norway.
>>voice: +47 55 95 93 55; fax +47 55 95 95 43
>>e-mail: Roger.Bivand at nhh.no
>
>
><span id=m2wTl><p><font face="Arial, Helvetica, sans-serif" size="2"
>style="font-size:13.5px">_________________________________________________
>______________<BR>Get the Free email that has everyone talking at <a
>href=http://www.mail2world.com
>target=new>http://www.mail2world.com</a><br>  <font
>color=#999999>Unlimited Email Storage – POP3 – Calendar –
>SMS – Translator – Much More!</font></font></span>
>	[[alternative HTML version deleted]]
>
>_______________________________________________
>R-sig-Geo mailing list
>R-sig-Geo at r-project.org
>https://stat.ethz.ch/mailman/listinfo/r-sig-geo



More information about the R-sig-Geo mailing list