我试图为函数生成统一的输入参数(无论用户输入数值还是单位对象,该函数都应该继续使用单位对象),当我偶然发现这种行为时,我现在无法真正解释:
# case 1 ---
ta <- 20
# expected output: 20 [°C]: fail
ifelse(inherits(ta, "units"),
ta,
units::as_units(ta, "°C"))
#> [1] 20
# case 2 ---
ta <- units::as_units(20, "°C")
# expected output: 20 [°C]: fail
ifelse(inherits(ta, "units"),
ta,
units::as_units(ta, "°C"))
#> [1] 20
# case 3 ---
ta <- 20
# expected output: 20 [°C]: everything OK
if (inherits(ta, "units")) ta else units::as_units(ta, "°C")
#> 20 [°C]
# case 4 ---
ta <- units::as_units(20, "°C")
# expected output: 20 [°C]: everything OK
if (inherits(ta, "units")) ta else units::as_units(ta, "°C")
#> 20 [°C]
我错过了什么?提前非常感谢!
这是因为
ifelse
剥离了属性。参见?ifelse
:
警告
结果的模式可能取决于测试的值(参见 示例),结果的类属性(参见 oldClass)是 取自测试,可能不适合选择的值 是和否。
在这些情况下,最好使用
if
。再次来自文档:
进一步注意,
效率更高, 当if(test) yes else no
是一个时,通常比ifelse(test, yes, no)
更可取 简单的真/假结果,即,当test
.length(test) == 1