оператор switch с несколькими условиями в r - PullRequest
0 голосов
/ 08 ноября 2018

Я хочу написать оператор switch в r с тремя условиями, но не могу заставить его работать. Что я делаю не так?

# 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 =
#>                           ^

Создано в 2018-11-08 пакетом представ. (v0.2.1)

Более простая версия этого оператора с одним условием делает работа-

# simpler switch
(test.description <- switch(
  EXPR = test.type,
  "p"  = "Student's t-test",
  "np" = "Durbin-Conover test"
))
#> [1] "Student's t-test"

Создано в 2018-11-08 пакетом Представление (v0.2.1)

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Другим решением может быть использование 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"
     )
)
0 голосов
/ 08 ноября 2018

Это не так, как работает функция 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 на следующей строке. Мне больше нравится форматирование выше, но ваши предпочтения могут отличаться.
...