我正在尝试在两个栅格之间应用相对简单的“栅格数学”计算。我似乎无法弄清楚如何在我的函数中正确设置NA值。我到处寻找答案,尝试了几种不同的方法来解决这个问题,但无济于事。
library(raster)
#Edited with feedback
fun.calc <- function(x, y, ...)
{
tree.w <- sum(x / (100 - y), ...)
ifelse(is.na(x) | is.na(y), NA, tree.w)
}
r1 <- raster(nrow=50, ncol = 50)
r1[] <- 90
r1[4:10,] <- NA
r2 <- raster(nrow=50, ncol = 50)
r2[] <- 40
r2[9:15,] <- NA
#Try UPDATED
fun.calc(r1[,,1], r2[,,1], fun=fun.calc, na.rm=TRUE)
这不会引发错误,但是我没有得到正确的值,在没有NA值的地方应该是1.5(我得到2850)。我不明白为什么这样做,但我想它与光栅中的矢量有关。
感谢您的想法!
答案 0 :(得分:1)
马上就可以了,我可以告诉你fun.calc1
应该重写为我下面的内容。你有太多的return
语句,实际上你根本就不需要它们。您也没有将...
参数传递给函数。如果您希望na.rm = TRUE
返回NA
或x
,我也不明白为什么您需要y
。
fun.calc1 <- function(x, y, ...)
{
tree.w <- sum(x / (100 - y), ...)
ifelse(is.na(x) | is.na(y), NA, tree.w)
}
屈服
> fun.calc1(5, 10)
# [1] 0.05555556
> fun.calc1(5, NA, na.rm = TRUE)
# [1] NA
与
相同fun.calc3 <- function(x, y) sum(x / (100 - y))
> fun.calc1(5, 10)
# [1] 0.05555556
> fun.calc3(5, NA)
# [1] NA
答案 1 :(得分:0)
似乎我必须这样才能得到这个答案的解决方案。我真的不明白为什么除了这似乎有效。如果有人有更好的答案,那就太好了。
fun.calc1 <- function(x, y, ...)
{
tree.w <- sum(x / (100 - y), ...)
length.xy <- length(which(!is.na(x) & !is.na(y)))
ifelse(is.na(x) | is.na(y), NA, tree.w/length.xy)
}
fun.calc1(r1[1:length(r1)],r2[1:length(r2)], na.rm=T)
同样,不确定为什么会有效,但我确实得到1.5的正确答案。