显然,switch存在逻辑参数问题,无法在FALSE
上进行评估。
> switch(T, "TRUE"=10, "FALSE"=50)
[1] 10
> switch(F, "TRUE"=10, "FALSE"=50)
(No return value)
我知道,对于T / F值我可以使用if / else但是switch的问题是一个单独的问题。它导致更奇怪的事情,如
> switch(2, "TRUE"=10, "FALSE"=50, "2"=200)
[1] 50
> switch(2, "TRUE"=10, "FALSE"=50, 2=200)
Error: unexpected '=' in "switch(2, "TRUE"=10, "FALSE"=50, 2="
Error during wrapup: argument "fun" is missing, with no default
为什么会发生这种情况,这是一个错误或功能?
答案 0 :(得分:6)
?switch
说
EXPR:评估数字或字符串的表达式
如果你将其他内容称为EXPR
,则R会进行最小侵入性强制,以便将EXPR
转换为数字或字符串;在这种情况下,逻辑值将转换为数字。问题是,当F
/ FALSE
被强制转换为数字时,它会变为0,从而选择 none 选项。这是一个黑客,但你可以使用
a <- FALSE
switch(a+1, "FALSE"=10, "TRUE"=50) ## 10
a <- TRUE
switch(a+1, "FALSE"=10, "TRUE"=50) ## 50
...但您必须记住将选项置于FALSE / TRUE顺序(标签忽略)。我认为这是一个坏主意,因为它很棘手/非显而易见。我想,惯用的R将是
if (a) 50 else 10
(这可能看起来太棘手了,但实际上比ifelse()
更适合于标量比较;如果您和您的同事发现它更具可读性,您可以使用ifelse()
而不会损失很多)
在你的第二个例子(switch(2, "TRUE"=10, "FALSE"=50, "2"=200)
)中,你给了switch()
一个整数,所以R按位置选择(第二个选项的值为50)。在您的第三个示例(switch(2, "TRUE"=10, "FALSE"=50, 2=200)
)中,2
不是参数的有效名称。
答案 1 :(得分:1)
我自己只需要类似的东西,即为TRUE
,FALSE
和(逻辑)NA
返回不同的值。另一个可行的选择是显式地将逻辑标量输入转换为字符。
switch_fun <- function(x) {
switch(
as.character(x),
`TRUE` = "TRUE!",
`FALSE` = "FALSE!",
"NA!"
)
}
switch_fun(TRUE)
#> [1] "TRUE!"
switch_fun(FALSE)
#> [1] "FALSE!"
switch_fun(NA)
#> [1] "NA!"