В чем же причина двойного принуждения?

Я пытаюсь понять объяснение принуждения для удвоений:

as.logical(c(-1, -0.01, 0, 0.01, 0.1,1:10))
#>  [1]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
#> [12]  TRUE  TRUE  TRUE  TRUE

Я вижу, что принуждение происходит на скаляре (знак не имеет значения) и что только ровно 0 принуждается к FALSE. Я был удивлен этим, кажется, нет понятия "ближе всего..." или округления до 0L или 1L. Мне любопытно, почему.

Я старался охотиться за пониманием здесь но без успеха.

Я также рассмотрел этот связанный вопрос.

Может кто-нибудь объяснить, почему я должен ожидать, что каждое из указанных выше значений принуждать, как и они?

Ответ 1

Я предполагаю, что это наследуется от C, например. от здесь:

В C true представлено любое числовое значение, не равное 0, а false представлено 0

Также см., например, здесь; на данный момент я не могу найти лучшего источника для официальной спецификации языка.

Пиратская копия Kernighan и Ritchie 2d ed. Я нашел онлайн (я бы предпочел не ссылаться на него). 50, раздел 3.2, "If-Else" (выделено мной):

Выражение оценивается; если это правда (, то есть если выражение имеет ненулевое значение), выполняется оператор 1. Если оно ложно (выражение равно нулю), а если есть часть else, вместо этого выполняется оператор 2.

@hrbrmstr указывает, что внутреннее определение R LOGTIC, используемое для преобразования, находится в Rinternals.h:

#define LOGICAL(x) ((int *) DATAPTR(x))