为什么 `ifelse()` 的行为与 `if (cond) {...} else {...}` 不同

问题描述 投票:0回答:1

我试图为函数生成统一的输入参数(无论用户输入数值还是单位对象,该函数都应该继续使用单位对象),当我偶然发现这种行为时,我现在无法真正解释:

# 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]

我错过了什么?提前非常感谢!

r if-statement
1个回答
2
投票

这是因为

ifelse
剥离了属性。参见
?ifelse

警告

结果的模式可能取决于测试的值(参见 示例),结果的类属性(参见 oldClass)是 取自测试,可能不适合选择的值 是和否。

在这些情况下,最好使用

if
。再次来自文档:

进一步注意,

if(test) yes else no
效率更高, 当
ifelse(test, yes, no)
是一个时,通常比
test
更可取 简单的真/假结果,即,当
length(test) == 1
.

© www.soinside.com 2019 - 2024. All rights reserved.