Почему только 1 == TRUE, true, в R и другие числа ложны? - PullRequest
1 голос
/ 11 апреля 2020

Что произойдет, если оператор if () не содержит логического выражения?

Например, блок if-else if (2) {print ("A")} else {print ("B")}) выдает A, но 2 не соответствует true, поэтому он должен вывести B. Почему?

Ответы [ 2 ]

4 голосов
/ 11 апреля 2020

Это потому, что любое значение, отличное от 0, будет приведено к ИСТИНА, а 0 будет ЛОЖЬ в if

if(2){print("A")}else{print("B")}
#[1] "A"
if(1) print("A")
#[1] "A"

if(0) print("A") else print("B")
#[1] "B"

. Это можно проверить с помощью as.logical

as.logical(c(0, 1, 2, -1, 5, 3))
#[1] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE

Здесь ИСТИНА будет отображаться в 1, а ЛОЖЬ - в 0 (двоичный), и if может иметь только два случая: ИСТИНА или ЛОЖЬ.


В заголовке был еще один вопрос и именно поэтому 1== TRUE. Причина в том, что TRUE / FALSE внутренне 1/0. Таким образом, 1 принуждается к ИСТИНА или ИСТИНА к 1 в течение ==, в то время как другие числа остаются как таковые

1 голос
/ 11 апреля 2020

Вы задаете два отдельных вопроса.

Во-первых, один в вашем заголовке спрашивает, почему 1 - это единственное число, которое проверяет значение, равное TRUE. Для сравнения x == TRUE необходимо, чтобы x и TRUE были одного типа. Обычно логика типа TRUE будет преобразована в тот же тип, что и x. (Единственное исключение - если x имеет тип «raw», который используется редко. Он будет преобразован в логический.)

Если x - это число, то оно остается как есть, и TRUE преобразуется в число 1. Таким образом, сравнение становится x == 1, и это верно только тогда, когда x равно 1. Если x было символьным значением, TRUE станет "TRUE", и это только равное значение.

Ваш второй вопрос о том, что происходит, когда в if(condition) используется нелогичный condition. В этом случае condition преобразуется в логическое значение. Для чисел существует три возможности: 0 становится FALSE, NA или NaN выдает ошибку, а любое другое число становится TRUE. Для символов несколько различных значений ("FALSE", "F", "false" и "False") дают FALSE, а некоторые дают TRUE, но большинство выдает ошибку.

...