【问题标题】:Using several ifelse statements with rasters对栅格使用多个 ifelse 语句
【发布时间】:2019-09-04 01:08:32
【问题描述】:

我想根据 y 和 x 的原始条件对相同的 2 个光栅文件应用不同的轻微方程:

  1. 如果 y 为正,x 为负:atan2(y,x)*180/pi

  2. 如果y为负,x为负,atan2(y,x)*180/pi + 90

  3. 如果y为负,x为负,atan2(y,x)*180/pi + 180

  4. 如果y为正,x为负,atan2(y,x)*180/pi + 270

我尝试将多个 ifelse 语句分组到一个函数中:

y <- raster(y) #formal raster class layer
x <- raster(x) #formal raster class layer

quad <- if(y>0 & x>0){
    (atan2(y,x)*180/pi)
}else{
    if(y<0 & x>0)
    ((atan2(y,x)*180/pi) +90)
}else{
    if(y<0 & x>0)
    ((atan2(y, x)*180/pi) +180)
}else{
    if (y>0 & x<0)
    ((atan2(y,x)*180/pi) +270)

错误:“}”中出现意外的“}” 错误:意外的“其他”在: " ((atan2(y,x)*180/pi) +90) }其他”

它也不会创建新对象。

【问题讨论】:

  • 是的,你是对的..这是一个错误!

标签: r


【解决方案1】:

总是包含一些示例数据

library(raster)
r <- raster(nrow=10, ncol=10)
x <- setValues(r, sample(-180:180,ncell(r),replace=T))
y <- setValues(r, sample(-90:90,ncell(r),replace=T))

解决此类问题的一般方法是编写一个函数,对其进行测试,然后将其与calc 或overlay 一起使用

fq <- function(x, y) {
    ifelse(y>0 & x>0, atan2(y,x)*180/pi, 
        ifelse(y<0 & x>0, atan2(y,x)*180/pi +90, 
        ifelse(y<0 & x<0, atan2(y,x)*180/pi +180,
        atan2(y,x)*180/pi +270)))
}

q <- overlay(x, y, fun=fq)

另一种更简洁的写法

fq2 <- function(x, y) {
    z <- ifelse(y>0, ifelse(x>0, 0, 270), ifelse(x>0, 90, 180))
    atan2(y, x) * 180/pi + z
}
q2 <- overlay(x, y, fun=fq2)

或者像这样

fz <- function(x, y) {
    z <- ifelse(y>0, ifelse(x>0, 0, 270), ifelse(x>0,90, 180))
}
z <- overlay(x, y, fun=fz)
q3 <- atan2(y, x) * (180/pi) + z

或使用隐藏的尚不支持 raster:::.ifel 方法

zz <- raster:::.ifel(y>0, raster:::.ifel(x>0, 0, 270), raster:::.ifel(x>0,90, 180))
q4 <- atan2(y, x) * (180/pi) + zz

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多