Почему TRUE == "TRUE" имеет значение TRUE в R?
- Почему
TRUE == "TRUE"
есть TRUE
в R?
- Есть ли эквивалент для
===
в R?
Update:
Все они возвращаются FALSE
:
TRUE == "True"
TRUE == "true"
TRUE == "T"
Единственное значение TRUE
- TRUE == "TRUE"
.
В случае проверки с помощью identical()
все работает нормально.
Второе обновление:
Оператором ===
я имел в виду процесс проверки значения и типа данных переменной. В этом случае я предположил, что оператор ==
будет сравнивать только значения переменных, а не их Тип данных.
Ответы
Ответ 1
В соответствии с файлом справки ?`==`
:
Если два аргумента являются атомарными векторами разных типов, один принуждается к типу другого, (убывающий) порядок приоритета является символом, сложным, числовым, целым, логическим и необработанным.
So TRUE
принуждается к "TRUE"
(i. e. as.character(TRUE)
), следовательно, равенство.
Эквивалент оператора ===
(то есть два объекта равны и одного типа) будет функцией identical
:
identical(TRUE, "TRUE")
[1] FALSE
Ответ 2
TRUE и FALSE являются зарезервированными словами в R. Я не думаю, что eznme был прав (до его редактирования), когда он сказал, что любое ненулевое значение было TRUE, поскольку TRUE == "A"
оценивается как FALSE. (Это было бы правильно объяснить, почему TRUE == 1
оценивает значение TRUE, но не объясняет результат для TRUE == 7
Объяснение, данное plannapus, было выведено из контекста описания поведения as.logical
. Он ближе к "истине", потому что это неявное принуждение TRUE к символу с помощью оператора ==
, который создает этот результат. Хотя T
и F
изначально заданы значения TRUE и FALSE, их можно переназначить другими значениями или типами.
> TRUE == as.logical( c("TRUE", "T", "true", "True") )
[1] TRUE TRUE TRUE TRUE
> TRUE == 7
[1] FALSE
> TRUE == as.logical(7)
[1] TRUE
> TRUE == as.logical("A")
[1] NA
(ранее я неправильно писал, что принуждение, индуцированное TRUE == "TRUE", было логичным: на самом деле через as.character(TRUE) возвращается "TRUE".)
Ответ 3
В дополнение к
ИСТИНА == "ИСТИНА"
это также верно:
- ИСТИНА == 1
- TRUE == 1.0
- ИСТИНА == 1.0000000000000001
- ИСТИНА == +0,99999999999999999
и т.д., в целом также все значения, близкие к 1.0, должны быть округлены до IEEE754.
Но более интересным является проверка if()
: он проверяет non-false
; на самом деле эти сюжеты!:
if(4.0) plot(1)
Я думаю, что единственные значения, которые не запускают if()
, равны 0, F, FALSE и FALSE, они кажутся точно равными 0.