[R-sig-Geo] lapply and SpatialGridDataFrame
Roger Bivand
Roger.Bivand at nhh.no
Tue Jan 29 09:07:32 CET 2013
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
>
>
> <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
>
--
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
More information about the R-sig-Geo
mailing list