ленивая оценка в Advanced R - PullRequest
0 голосов
/ 14 июня 2019
x_ok <- function(x) {
!is.null(x) && length(x) == 1 && x > 0
}

x_ok(1)
#> [1] TRUE
x_ok(1:3)
#> [1] FALSE

Желаемое поведение достигается путем объединения утверждений через && вместо &.&& не выполняет поэлементное сравнение.Вместо этого он использует только первый элемент каждого значения.Он также использует отложенную оценку в том смысле, что оценка

"продолжается только до определения результата"

(из? Logic) (из advanced.R)

Ленивая оценка для аргументов, а не для уравнений в функции, но это предложение

В нем также используется ленивая оценка, в том смысле, что оценка «продолжается только до определения результата»

говорят, что оценка выполнена в отношении содержания функции.ПОЧЕМУ ???

1 Ответ

1 голос
/ 14 июня 2019

&& не работает поэлементно, а использует короткое замыкание .Идея состоит в том, что RHS && может быть недействительным, если LHS - ЛОЖЬ, но это нормально, так как RHS никогда не оценивается в этом случае.Например, здесь RHS может генерировать ошибку, если она была оценена, но это никогда не происходит, поскольку LHS - ЛОЖЬ.

x <- "A"
is.numeric(x) && x + 1 < 0

Если бы это не работало таким образом, нам пришлось бы использовать более длинное:

if (is.numeric(x)) x + 1 < 0 else FALSE
...