功能概述
我创建了一个函数来计算结果方位之间的方向变化(这是根据我的纬度和经度数据计算得出的)。
方向角始终相对于北-南线(即远离北的度数),因此彼此平行,并且是较正的(0 -> +180)或负的(0 -> -180)。我已经考虑到了方位的符号(正的或负的)和‘幅度’(>90或<90),这使得我可以使用基本的trig来创建‘规则’来计算方向变化。
该函数评估两个结果方向(即A- TO - B),对方向(正方向或负方向)和方向值(>90或<90)进行分类。它使用这些分类来确定要使用哪个“规则”,然后使用与该规则相关联的计算来计算方向变化。请参见下面的函数:
函数
analyzeGPS_DirectionChange <- function(bearingVec1, bearingVec2) {
a1 <- ifelse (bearingVec1 >= 0.00, "positive", "negitive")
a2 <- ifelse (bearingVec2 >= 0.00, "positive", "negitive")
Bearing_Signs <- paste(a1, a2)
b1 <- ifelse (abs(bearingVec1) < 90.00, "less", "greater")
b2 <- ifelse (abs(bearingVec2) < 90.00, "less", "greater")
Bearing_Values <- paste(b1, b2)
print(Bearing_Signs)
print(Bearing_Values)
if (Bearing_Signs == "positive positive" && Bearing_Values == "less less") {
Direction_Change <- (90 - bearingVec1) + (90 + bearingVec2)
} else if (Bearing_Signs == "positive positive" && Bearing_Values == "less greater") {
Direction_Change <- (180 - bearingVec2) + bearingVec1
} else if (Bearing_Signs == "positive positive" && Bearing_Values == "greater less") {
Direction_Change <- 180 - ((bearingVec1 - 90) + (90 - bearingVec2))
} else if (Bearing_Signs == "positive positive" && Bearing_Values == "greater greater") {
Direction_Change <- (bearingVec1 - 90) + (180 - bearingVec2) + 90
}
if (Bearing_Signs == "positive negitive" && Bearing_Values == "less less") {
Direction_Change <- 180 - (abs(bearingVec2) + bearingVec1)
} else if (Bearing_Signs == "positive negitive" && Bearing_Values == "less greater") {
Direction_Change <- 180 - (90 + (90 - bearingVec1) + (180 - abs(bearingVec2)))
} else if (Bearing_Signs == "positive negitive" && Bearing_Values == "greater less") {
Direction_Change <- 90 - ((bearingVec1 - 90) + abs(bearingVec2))
} else if (Bearing_Signs == "positive negitive" && Bearing_Values == "greater greater") {
Direction_Change <- 180 - ((180 - bearingVec1) + (180 - abs(bearingVec2)))
}
if (Bearing_Signs == "negitive positive" && Bearing_Values == "less less") {
Direction_Change <- 180 - (abs(bearingVec1) + bearingVec2)
} else if (Bearing_Signs == "negitive positive" && Bearing_Values == "less greater") {
Direction_Change <- 180 - (90 + (90 - abs(bearingVec1)) + (180 - bearingVec2))
} else if (Bearing_Signs == "negitive positive" && Bearing_Values == "greater less") {
Direction_Change <- 90 - ((abs(bearingVec1) - 90) + bearingVec2)
} else if (Bearing_Signs == "negitive positive" && Bearing_Values == "greater greater") {
Direction_Change <- 180 - ((180 - abs(bearingVec1)) + (180 - bearingVec2))
}
if (Bearing_Signs == "negitive negitive" && Bearing_Values == "less less") {
Direction_Change <- (90 - abs(bearingVec2)) + (90 + abs(bearingVec1))
} else if (Bearing_Signs == "negitive negitive" && Bearing_Values == "less greater") {
Direction_Change <- (180 - abs(bearingVec2)) + abs(bearingVec1)
} else if (Bearing_Signs == "negitive negitive" && Bearing_Values == "greater less") {
Direction_Change <- (180 - abs(bearingVec1)) + abs(bearingVec2)
} else if (Bearing_Signs == "negitive negitive" && Bearing_Values == "greater greater") {
Direction_Change <- (abs(bearingVec1) - 90) + 90 + (180 - abs(bearingVec2))
}
return(Direction_Change)
}问题
当我使用该函数时,它会正确地计算方向角输入(我已经包含了print语句,以便您可以轻松地对其进行评估)。请看下面的工作示例(我手动检查了它和其他人,以仔细检查数学和赋值等...)
analyzeGPS_DirectionChange(bearingVec1 = 100.6587, bearingVec2 = 24.66356)
[1] "positive positive"
[1] "greater less"
[1] 104.0049然而,当我在函数中运行两个代表结果点的向量时,一些计算正确,另一些是错误的。下面是一个例子:
bearingVec1 <- c(1.988956, 100.658682, 24.663563, 122.423408, -30.556419, 14.702280, -74.235212, -5.619550, 78.729953, -135.463404, -2.600200)
bearingVec2 <- c(100.658682, 24.663563, 122.423408, -30.556419, 14.702280, -74.235212, -5.619550, 78.729953, -135.463404, -2.600200, -6.733987)
analyzeGPS_DirectionChange(bearingVec1, bearingVec2)
[1] "positive positive" "positive positive" "positive positive" "positive negitive" "negitive positive" "positive negitive"
[7] "negitive negitive" "negitive positive" "positive negitive" "negitive negitive" "negitive negitive"
[1] "less greater" "greater less" "less greater" "greater less" "less less" "less less" "less less" "less less"
[9] "less greater" "greater less" "less less"
[1] 81.33027 255.99512 82.24015 332.97983 134.74130 268.93749 111.38434 95.65050 394.19336 47.13680 184.13379乍一看,它似乎是有效的,但在实际值答案中有一些错误,请参阅上面的第一个示例,当我手动输入方位角值时,该示例计算正确-这些数字对应于我提供的样本数据中的bearingVec12和bearingVec22。
我不知道为什么当我为函数提供向量时,它的计算是错误的。请帮我解决这个问题!
发布于 2019-09-17 23:02:04
这个问题源于if与&&的结合。来自&&的帮助
‘&’和‘&&’表示逻辑与,‘|’和‘||’表示逻辑或。较短的形式执行元素比较的方式与算术运算符非常相似。较长的形式从左到右计算,只检查每个向量的第一个元素。
也就是说,您的if子句将始终回退到第一个元素。不是你想要的。
另一方面,ifelse是矢量化的。因此,您可以将所有的if子句替换为ifelse构造,考虑到所有的嵌套ifs,这可能会变得非常棘手。
另一种解决方案是使用任何形式的循环来仅将单个值传递给函数。然而,这种方法不是很优雅,并且您没有充分利用R的内置功能来处理向量,并且可能比重写函数来正确处理向量慢得多,但您可以很容易地使用您的函数:
purrr::map2_dbl(bearingVec1, bearingVec2, analyzeGPS_DirectionChange)
# [1] 81.33027 104.00488 82.24016 27.02017 134.74130 91.06251 248.61566
# [8] 95.65050 34.19336 47.13680 175.86621另一种选择是使用Vectorize,它向量化了你的函数(基本上是在幕后做一个mapply ):
Vectorize(analyzeGPS_DirectionChange)(bearingVec1, bearingVec2)
# [1] 81.33027 104.00488 82.24016 27.02017 134.74130 91.06251 248.61566
# [8] 95.65050 34.19336 47.13680 175.86621https://stackoverflow.com/questions/57976331
复制相似问题