Начиная с R 3.1.0 anyNA()
это способ сделать это.На атомных векторах это остановится после первого NA вместо прохождения всего вектора, как было бы в случае any(is.na())
.Кроме того, это позволяет избежать создания промежуточного логического вектора с is.na
, который немедленно отбрасывается.Заимствование примера Джорана:
x <- y <- runif(1e7)
x[1e4] <- NA
y[1e7] <- NA
microbenchmark::microbenchmark(any(is.na(x)), anyNA(x), any(is.na(y)), anyNA(y), times=10)
# Unit: microseconds
# expr min lq mean median uq
# any(is.na(x)) 13444.674 13509.454 21191.9025 13639.3065 13917.592
# anyNA(x) 6.840 13.187 13.5283 14.1705 14.774
# any(is.na(y)) 165030.942 168258.159 178954.6499 169966.1440 197591.168
# anyNA(y) 7193.784 7285.107 7694.1785 7497.9265 7865.064
Обратите внимание, что это существенно быстрее, даже если мы изменим последнее значение вектора;это частично из-за избежания промежуточного логического вектора.