Логические операторы R: && и || vs & и | - PullRequest
1 голос
/ 06 мая 2020

Я думал, что уже понял, как работают логические операторы в [R] ... оказалось, что это была своего рода иллюзия. Сегодня я попытался создать условие if, которое выдает сообщение об ошибке, если значение равно NULL или значение не находится в данном векторе. Мой первый подход с обычным ИЛИ (|) не сработал. Мой второй подход с двойным OR (||), похоже, работает ... все же я не уверен на 100%, почему он работает (и действительно ли он работает). Так что, если бы кто-то мог помочь мне наконец разобраться, я был бы очень признателен: D

Вот пример, который должен проиллюстрировать проблему более подробно:

# first approach (does not work)
check_val1 <- function(x){
  vals <- c("a","b","c")
  if (is.null(x) | !x %in% vals){
    print("wrong input")
  } else {
    print("correct input")
  }
}

# second approach (works)
check_val2 <- function(x){
  vals <- c("a","b","c")
  if (is.null(x) || !x %in% vals){
    print("wrong input")
  } else {
    print("correct input")
  }
}

check_val1(NULL)
# result: error in if (is.null(x) | !x %in% vals) { : argument is of length zero
check_val1("foo")
# result: "wrong input"
check_val1("a")
# result: "correct input"

check_val2(NULL)
# result: "wrong input"
check_val2("foo")
# result: "wrong input"
check_val2("a")
# result: "correct input"

Работает ли второй подход потому что вторая часть (! x% в% vals) условия оценивается только в том случае, если первая часть (is.null (x)) НЕ ИСТИНА? Это имело бы смысл, поскольку условие является ИСТИННЫМ, как только одна его часть становится ИСТИННОЙ. Так что нет необходимости оценивать вторую часть ... тем не менее ... это объяснение кажется несколько произвольным. Есть ли лучший вариант (я уже проверил документацию. Приведенное там объяснение немного помогает, но, в конце концов, оно как-то сбивает меня с толку ^^)

Конечно, я мог бы просто использовать два отдельных оператора if для избежать проблемы, но использование одного условия мне кажется более элегантным: D

Спасибо за вашу помощь :)

...