我想根据y和x的原始条件,对相同的2个栅格文件应用略有不同的方程式:
如果y为正且x为负:atan2(y,x)* 180 / pi
如果y为负且x为负,则atan2(y,x)* 180 / pi + 90
如果y为负且x为负,则atan2(y,x)* 180 / pi + 180
如果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)
错误:“}”中出现意外的'}' 错误:出现意外的“ else”: ”(((atan2(y,x)* 180 / pi)+90) }其他”
它也不会创建新对象。
答案 0 :(得分: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