Skip to content

Error in applying calc to rasterbrick with NA vallues

3 messages · Loïc Dutrieux, Jackson Rodrigues

#
Dear all,

I am sorry for previous email. I am learning how to handle correctly this
list.

On R-sig-Geo Digest, Vol 201, Issue 5  I got a smart solution for my tests
with parallelization.

However, my original data has NA values, and applying the function created
to my data I get some errors.
I have played around with other commands like na.rm, na.action=na.exclude
or reclassifications and none worked.

Could someone give me some herp again?

best wishes,

Jackson
################
library(raster)
library(trend)

r <- raster(ncol=96, nrow=63, vals=runif(63*96))
n <- 672  # number of copies
s <- stack(lapply(1:n, function(i) rz<-stack(r[i]<-(r^2/3))))
s[s < 0.1] <- NA

# Define the function to apply to each pixel; it should return a numeric
or a vector of numerics with always the same lenght
fun <- function(x){
  out <- pettitt.test(x)[3]$estimate
  return(unname(out))
}

# Check that it works
fun(seq(2000))

# Check that it works with calc
s_out <- calc(s, fun = fun)

Error in .calcTest(x[1:5], fun, na.rm, forcefun, forceapply) :
  cannot use this function

# Parallelize with clusterR
beginCluster()
s_out <- clusterR(s, fun=calc, args=list(fun=fun))

[1] "cannot use this function"
attr(,"class")
[1] "snow-try-error" "try-error"
Error in clusterR(s, fun = calc, args = list(fun = fun)) : cluster error

endCluster()
##############
#
Hi Jackson,

All the layers of the toy dataset you create in your example are 
identical. Is that intentional?
Below I create a more heterogeneous dataset and introduce a few NAs.

library(raster)
library(trend)

set.seed(12)
r <- raster(nrow=10, ncol=10)
s <- lapply(1:200, function(i) setValues(r, rnorm(ncell(r), 
sample.int(5,1), 0.5)))
s <- stack(s)

s[s < 0] <- NA

# Visualize that some pixels have NAs and other don't
hasna <- stackApply(s, indices = 1, fun = function(x, na.rm){anyNA(x)})
plot(hasna)

# pettitt.test function does not handle NAs, so you need to add a condition
# to "exclude" vectors that contain NAs
fun <- function(x){
     out <- ifelse(anyNA(x),
                   yes = NA,
                   no = unname(pettitt.test(x)[3]$estimate))
     return(out)
}

# Check that it works
fun(as.vector(s[1])) # first pixel, does not contain NAs
fun(as.vector(s[2])) # second pixel, contains NAs

# Check that it works with calc
s_out <- calc(s, fun = fun)
plot(s_out)


Cheers,
Lo?c
On 05/08/2020 03:59 PM, Jackson Rodrigues wrote:
#
Hi Loic,

Thank you again.

Actually, I did not worry about data quality created.
My concern was a creation of the same amount of data I originally have.

Your suggestion worked perfectly! I tried to replace NAs by 0 in the
begining, but I got errors.

So, thank you again.

Cheers

Jackson

Em sex, 8 de mai de 2020 12:08, Lo?c Dutrieux <loic.dutrieux at cirad.fr>
escreveu: