В программировании на R, в чем разница между & vs && и | против || - PullRequest
2 голосов
/ 14 февраля 2020

Я знаю ту часть, которая && и || сделать для более эффективного кода, потому что они делают наименьшее количество тестов в цепочке и разрываются, как только у нас будет достаточно информации, чтобы знать, каков будет результат цепочки.

  • Как только && встречает FALSE в цепочке, он прекращает оценку и возвращает FALSE для всей цепочки.
  • Как только || попадает в цепочку «ИСТИНА», останавливает оценку и возвращает «ИСТИНА» для цепочки

Но я прочитал в книге Гаррета Гролемунда, что «... двойные операторы не везде применимы. &&& и || не векторизованы, что означает, что они могут обрабатывать только один логический тест на каждой стороне оператора ... "Может кто-нибудь объяснить мне, что означает выделенная часть?

Были ли проведены некоторые простые тесты, и хотя & выполняет поэлементное сравнение между соответствующими элементами двух логических векторов, && сравнивает только первые элементы и возвращает TRUE, потому что оператор не проверен? Означает ли это все выделенную часть, указанную выше, или есть что-то большее?

c(T, F, F, F, F) & c(T, T, F, T, F)
[1]  TRUE FALSE FALSE FALSE FALSE

c(T, F, F, F, F) && c(T, T, F, T, F)
[1] TRUE

c(F, F, F, F, F) && c(T, T, F, T, F)
[1] FALSE

Свертывание векторов с обеих сторон оператора до одного логического значения с использованием any и all.

any(T, T, F, F, T) && all(F, F, T, T, T)
[1] FALSE

any(T, T, F, F, T) && any(F, F, T, T, T)
[1] TRUE

1 Ответ

6 голосов
/ 14 февраля 2020

они могут обрабатывать только один логический тест на каждой стороне оператора

a <- c(T, F, F, F)
b <- c(T, F, F, F)
a && b

Возвращает [1] ИСТИНА

Поскольку только первый элемент a и b проверены!

Редактировать:

Рассмотрим следующее, где мы «вращаем» a и b после каждого && теста:

a <- c(T, F, T, F)
b <- c(T, F, F, T)
for (i in seq_along(a)){
  cat(paste0("'a' is: ", paste0(a, collapse=", "), " and\n'b' is: ", paste0(b, collapse=", "),"\n"))
  print(paste0("'a && b' is: ", a && b))
  a <- c(a[2:length(a)], a[1])
  b <- c(b[2:length(b)], b[i])
}

Дает нам:

'a' is: TRUE, FALSE, TRUE, FALSE and
'b' is: TRUE, FALSE, FALSE, TRUE
[1] "'a && b' is: TRUE"
'a' is: FALSE, TRUE, FALSE, TRUE and
'b' is: FALSE, FALSE, TRUE, TRUE
[1] "'a && b' is: FALSE"
'a' is: TRUE, FALSE, TRUE, FALSE and
'b' is: FALSE, TRUE, TRUE, FALSE
[1] "'a && b' is: FALSE"
'a' is: FALSE, TRUE, FALSE, TRUE and
'b' is: TRUE, TRUE, FALSE, TRUE
[1] "'a && b' is: FALSE"

Дополнительно , &&, || останавливается, как только выражение становится ясным:

FALSE & a_not_existing_object
TRUE | a_not_existing_object

Возвращает:

Error: object 'a_not_existing_object' not found
Error: object 'a_not_existing_object' not found

Но:

FALSE && a_not_existing_object
TRUE || a_not_existing_object

Возвращает:

[1] FALSE

[1] TRUE

Потому что что-нибудь после FALSE И что-то (и TRUE ИЛИ что-то) становится FALSE и TRUE соответственно

Это Последнее поведение && и || особенно полезно, если вы хотите проверить в потоке управления элемент, который может не существовать:

if (exists(a_not_existing_object) && a_not_existing_object > 42) {...}

Таким образом, оценка останавливается после того, как первое выражение оценивается как FALSE и * 106 2 * часть даже не пыталась!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...