为何R中ifelse()与if (cond) {...} else {...}行为存在差异?
问题根源:
ifelse会剥离对象的特殊属性 你遇到的差异核心在于**ifelse的设计逻辑和普通if/else完全不同**:
ifelse本质是向量化函数,它会强制把所有返回值转换为统一的原子向量类型,过程中会丢失对象的特殊类和属性(比如units对象的单位信息)。不管你返回的是原units对象还是新创建的units对象,ifelse都会把它拆解成普通数值,导致单位丢失。- 普通
if/else是流程控制语句,它会直接返回原对象,完整保留其类、属性和单位信息,所以能正确输出带°C单位的结果。
验证代码
可以通过查看返回值的类来确认这一点:
ta <- units::as_units(20, "°C") result_ifelse <- ifelse(inherits(ta, "units"), ta, units::as_units(ta, "°C")) class(result_ifelse) # 输出 "numeric",而非预期的 "units" result_if <- if (inherits(ta, "units")) ta else units::as_units(ta, "°C") class(result_if) # 输出 "units",保留了对象类型
替代方案
如果习惯用向量化的条件判断,可以使用dplyr::if_else(它会保留对象的属性):
library(dplyr) # 输入数值的情况 ta <- 20 dplyr::if_else(inherits(ta, "units"), ta, units::as_units(ta, "°C")) #> 20 [°C] # 输入units对象的情况 ta <- units::as_units(20, "°C") dplyr::if_else(inherits(ta, "units"), ta, units::as_units(ta, "°C")) #> 20 [°C]
内容的提问来源于stack exchange,提问作者dimfalk
相关产品推荐
相关产品推荐

