Подтвердить что ты не робот

R `Inf`, когда он имеет класс` Date`, печатает `NA`

Рассмотрим следующий пример:

structure(NA_real_, class = "Date")
## [1] NA
structure(Inf, class = "Date")
## [1] NA
is.na(structure(NA_real_, class = "Date"))
## [1] TRUE
is.na(structure(Inf, class = "Date"))
## [1] FALSE

Оба печатаются как NA. Является ли это ожидаемым поведением или это ошибка? Очень неприятно видеть NA для чего-то, что не вернет TRUE для is.na().

4b9b3361

Ответ 1

Это ожидаемое поведение. То, что напечатано, не является тем, чем является объект. Для печати объект должен быть преобразован в символ. as.character.Date вызывает format.Date, который вызывает format.POSIXlt. Раздел Value ?format.POSIXlt (или ?strptime) говорит:

Методы format и strftime возвращают символьные векторы представляя время. NA время возвращается как NA_character_.

Итак, почему NA печатается, потому что печать structure(NA_real_, class = "Date") возвращает NA_character_. Например:

R> is.na(format(structure(Inf, class = "Date")))
[1] TRUE
R> is.na(format(structure(NaN, class = "Date")))
[1] TRUE

Если вы каким-то образом столкнетесь с этими выигрышными датами в своем коде, я рекомендую вам протестировать их, используя is.finite вместо is.na.

R> is.finite(structure(Inf, class = "Date"))
[1] FALSE
R> is.finite(structure(NaN, class = "Date"))
[1] FALSE