求助:修复R语言三数求中位数的if分支代码错误
问题排查与修复
原函数的三个关键错误
- 核心逻辑颠倒:当
a是最大值时(a > b且a > c),原代码返回的是b和c中的较小值,完全搞反了中位数的取值逻辑,导致结果错误。 - 遗漏相等值场景:当存在两数相等(如
a==b、a==c)或三数全相等时,所有if/else if分支都不匹配,函数会返回NULL,这是运行报错的直接原因。 - 冗余无效分支:第三个
else if(c > a)分支完全多余,前两个分支已经覆盖了a > b和b > a的情况,剩下的只有a == b的场景,该分支不仅没必要,逻辑也不正确。
修复后的分支实现
下面的代码纠正了逻辑错误,覆盖了所有可能的数值场景:
find_median = function(a, b, c){ if(a > b){ if(a > c){ # a是最大值,中位数取b和c中的较大者 return(ifelse(c > b, c, b)) } else { # a处于中间位置,直接返回 return(a) } } else if(b > a){ if(b > c){ # b是最大值,中位数取a和c中的较大者 return(ifelse(c > a, c, a)) } else { # b处于中间位置,直接返回 return(b) } } else { # a与b相等,中位数就是a(或b) return(a) } }
验证测试用例
可以用以下测试用例验证修复后的函数:
# 常规不等值场景 find_median(1, 3, 2) # 返回2,正确 find_median(5, 1, 3) # 返回3,正确 find_median(1, 5, 3) # 返回3,正确 # 两值相等场景 find_median(2, 2, 1) # 返回2,正确 find_median(5, 3, 5) # 返回5,正确 # 三值相等场景 find_median(4, 4, 4) # 返回4,正确
更简洁的替代实现(可选)
如果不需要严格使用嵌套if分支,排序取中间值的写法更简洁且不易出错:
find_median = function(a, b, c){ sort(c(a, b, c))[2] }
内容的提问来源于stack exchange,提问作者LearningR
相关产品推荐
相关产品推荐

