Как условие, если операторы приводятся к логическому? - PullRequest
5 голосов
/ 12 марта 2019

В документации для if сказано, что условие должно быть (выделено мной):

Логический вектор длины один, который не является NA.Условия длиной больше единицы в настоящее время принимаются с предупреждением, но используется только первый элемент.Вместо этого сообщается об ошибке, когда для переменной среды _R_CHECK_LENGTH_1_CONDITION_ задано значение true. Другие типы приводятся к логическому, если это возможно, игнорируя любой класс.

Как осуществляется принуждение и что означает "игнорирование любого класса"?

Например, выражение list(1) может быть явно приведено к TRUE с помощью as.logical и неявно считается TRUE с помощью сравнений на равенство:

> as.logical(list(1))
[1] TRUE
> list(1) == TRUE
[1] TRUE

Почему тогда происходит следующее сбой?

> if (list(1)) print("Passed test!")
Error in if (list(1)) print("Passed test!") : 
  argument is not interpretable as logical

1 Ответ

1 голос
/ 12 марта 2019

Это происходит потому, что , если в R использует первичный объектный класс, в вашем примере первичным объектом является список, а не их содержимое, когда вы используете as.logical, внутренние значения преобразуются в логическое возвращение массив.

a = list(x = 1, y = 0)
as.logical(a) # TRUE FALSE

Только если значение первичного объекта является числовым или некоторые специальные строки могут быть преобразованы в логические по умолчанию.

if("true") "ok" # ok
if(-1) "ok" # ok

val = 1
class(val) = "test"
attr(a, "something") = 0

if(val) "ok" # ok

[EDIT_1]

Еще одна приятная вещь, которую нужно объяснить, - это факторы: фактор работает не как массив символов, а как массив чисел. Эти цифры относятся к значению «флаг».

val = factor("TRUE", "FALSE")
as.numeric(val) # 1 (for TRUE), 2 (for FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...