我想用三个条件在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创建
答案 0 :(得分:1)
这不是R的switch()
函数的工作原理。从语法上讲,这只是一个函数调用,因此选择器必须是可以被视为名称的东西,而不是像"p" & TRUE & TRUE
这样的表达式。因此,您的第一个开关可以打开test.type
,然后使用if
语句基于var.equal
和paired
选择值。但是,将其作为一系列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"
)
)