R中具有多个条件的switch语句

时间:2018-11-08 15:52:11

标签: r switch-statement

我想用三个条件在r中编写一个switch语句,但似乎无法使其正常工作。我在做什么错了?

<Grid Margin="10">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"></RowDefinition>
        <RowDefinition Height="10"></RowDefinition>
        <RowDefinition Height="50"></RowDefinition>
    </Grid.RowDefinitions>
    <Border Grid.Row="0" Background="Beige" BorderBrush="Black" BorderThickness="1" ></Border>
    <StackPanel Grid.Row="0" Grid.RowSpan="3" Orientation="Horizontal" VerticalAlignment="Bottom" >
        <Local:CustomButton Margin="0,0,10,0">Text1</Button>
        <Local:CustomButton>Text2</Button>
    </StackPanel>
</Grid>

reprex package(v0.2.1)于2018-11-08创建

只有一个条件起作用的该语句的简单版本-

# assigning some values
test.type <- "p"
var.equal<- TRUE
  paired <- FALSE

# preparing text for which p-value adjustment method was used
test.description <- switch(
    EXPR = test.type & var.equal & paired,
    "p" & TRUE & TRUE = "Student's t-test",
    "p" & FALSE & TRUE = "Student's t-test",
    "p" & TRUE & FALSE = "Student's t-test",
    "p" & FALSE & FALSE = "Games-Howell test",
    "np" & TRUE & TRUE = "Durbin-Conover test"
  )
#> Error: <text>:10:23: unexpected '='
#> 9:     EXPR = test.type & var.equal & paired,
#> 10:     "p" & TRUE & TRUE =
#>                           ^

reprex package(v0.2.1)于2018-11-08创建

2 个答案:

答案 0 :(得分:1)

这不是R的switch()函数的工作原理。从语法上讲,这只是一个函数调用,因此选择器必须是可以被视为名称的东西,而不是像"p" & TRUE & TRUE这样的表达式。因此,您的第一个开关可以打开test.type,然后使用if语句基于var.equalpaired选择值。但是,将其作为一系列if语句看起来可能会更好,如下所示:

test.description <- 
    if (test.type == "p" && !var.equal && !paired) "Games-Howell test" else
    if (test.type == "p")                          "Student's t-test" else
    if (test.type == "np" && var.equal && paired)  "Durbin-Conover test" else
                                                   "Unknown combination"

一些要注意的地方:

  • 您可以在表达式中使用if条语句 产生价值;这是一个重要的声明。
  • 如果else关键字已移动 到下一行,它将不起作用,因为到目前为止的代码 是完整的语句,因此else子句会悬空。 (对此有一些例外,但不要依赖它们。)
  • 您几乎应该始终在&&测试中使用标量if而不是向量&
  • 另一种格式化格式的方法是将值放在大括号中,右括号和下一行else在一起。我喜欢上面的格式,但您的偏好可能会有所不同。

答案 1 :(得分:0)

另一种解决方案可能是使用dplyr的case_when,其语法与您的switch语句更相似:

library(dplyr)

## initial dataframe
df <- data.frame(
  test.type = c("p", "p", "p", "p", "np", "np"),
  var.equal = c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE),
  paired = c(TRUE, TRUE, FALSE, FALSE, TRUE, FALSE)
  ) 

## add column test.description 
mutate(df,
  test.description = case_when(
      test.type == "p" & !var.equal & !paired  ~ "Games-Howell test",
      test.type == "p"                         ~ "Student's t-test",
      test.type == "np" & var.equal & paired   ~ "Durbin-Conover test",
      TRUE                                     ~ "Unknown combination"
     )
)