[R-sig-Geo] overlay() in raster package

Wearn, Oliver oliver.wearn08 at imperial.ac.uk
Thu Feb 25 16:23:03 CET 2010


Thanks Kamran, unfortunately I don't think the placement of 'else' has any effect - the same errors arise.

To answer the request for more details, here's a self-contained version of what my data pretty much looks like:

require(raster)
rs <- raster(system.file("external/test.grd", package="raster"))
ENN.500<-reclass(rs,rclmat=matrix(c(200,250,NA),ncol=3,byrow=T))
forest.cover<-reclass(rs,rclmat=matrix(c(0,160,0,160,290,1,290,xmax(rs),0),ncol=3,byrow=T))
plot(stack(forest.cover,ENN.500))

Cheers,
Oliver

________________________________________
From: Kamran Safi Radolfzell [ksafi at mail.orn.mpg.de]
Sent: 25 February 2010 14:42
To: Wearn, Oliver; r-sig-geo at stat.math.ethz.ch
Cc: r-sig-geo-bounces at stat.math.ethz.ch
Subject: Re: [R-sig-Geo] overlay() in raster package

Hi Oliver,

don't really understand what you are trying to do with the overlay, but the
"if" issue might be due to the wrong use of your "else".

if(...)
{
...
}else{  #important to have else on the same line
...
}

This might help.
If you need more help on the overlay, I guess more details would be helpful.

hth

Kami

On Thu, 25 Feb 2010 14:34:51 +0000, Wearn, Oliver wrote
> Dear all,
>
> I'm trying to use the overlay() function in the raster package, but
> can't get 'if' clauses to work. Can anyone help?
>
> I have two rasters, the first of which I would like to modify,
> depending on the value in the second (a forest cover raster).
> Specifically, if the value in the first (called ENN.500) is NA, I
> would like to change the value to zero, but only if the value in the
> forest cover raster is 1 (otherwise the value should just be left).
>
> So, I tried:
>
> test <- overlay(x = ENN.500,y = forest.cover,fun = function(x,y) {
>   if (is.na(x))  {
>     if (y==1)  {
>       return(0)
>     }
>     else {
>       return(x)
>     }
>   }
>   else {
>     return(x)
>   }
> })
>
> ...but I'm guessing overlay() doesn't work like this? I'm getting
> the following errors:
>
> Error: object 'applymethod' not found
> In addition: Warning message:
> In if (is.na(x)) { :
>   the condition has length > 1 and only the first element will be used
>
> I also tried:
>
> test <- overlay(x = ENN.500,y = forest.cover,fun = function(x,y) {
>   if (x[is.na(x)])  {
>     if (y[y==1])  {
>       return(0)
>     }
>     else {
>       return(x)
>     }
>   }
>   else {
>     return(x)
>   }
> })
>
> ...which returned the following error:
>
> Error in .overlayList(rasters, fun = fun, filename = filename,
> datatype = datatype,  :   cannot use this formula
>
> The alternative would be to use arithmetic operators:
>
> ENN.500[is.na(ENN.500] <- 0
> forest.cover[forest.cover==0] <- 1
> result <- ENN.500*forest.cover
>
> ...but it says in ?overlay that this is slow for very large rasters
> (which I will be using), so I'm guessing I should try not to use
> this method?
>
> Thanks, in advance, for any help whatsoever.
> Oliver
> _______________________________________________
> R-sig-Geo mailing list
> R-sig-Geo at stat.math.ethz.ch
> https://stat.ethz.ch/mailman/listinfo/r-sig-geo


--
Open WebMail Project (http://openwebmail.org)


More information about the R-sig-Geo mailing list