switch有逻辑参数的问题

时间:2016-05-04 16:18:46

标签: r switch-statement boolean

显然,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

为什么会发生这种情况,这是一个错误或功能?

2 个答案:

答案 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)

我自己只需要类似的东西,即为TRUEFALSE和(逻辑)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!"