Я с удивлением наблюдал следующее поведение в R:
as.character(c(Sys.Date()))
#> [1] "2018-02-05"
as.character(list(Sys.Date()))
#> [1] "17567"
Почему это происходит? То есть, "17567" является результатом as.integer(Sys.Date)
, но я не следую логике, почему as.character(list(Sys.Date()))
должен завершать вызов as.integer()
.
(Обычно строки, обрабатываемые как целые числа, могут быть обвинены в отсутствии настроек
options(stringsAsFactors=FALSE)
, но, похоже, это не так.)
EDIT. Как отмечает Джош, это связано с основным поведением as.vector, но я не считаю это более интуитивным:
as.vector(Sys.Date())
#> 17567
as.vector(Sys.Date(), "character")
#> "17567"
Почему? (Да, я считаю, что даты хранятся как целые числа в внутренних структурах нижнего уровня, но это принуждение к буквальному целому числу в этом случае без предупреждения кажется мне удивительным).
И это проявляется более утонченными способами:
tbl <- tibble:::as_data_frame(list(col1 = list(Sys.Date(), "stuff")))
df <- as.data.frame(tbl)
df
#> col1
#> 1 17567
#> 2 stuff
df[1, 1]
#> [[1]]
#> [1] "2018-02-05"
Обратите внимание, что метод печати для data.frame
показывает дату как целое число, когда на самом деле это столбец списка, а дата все еще является датой.
Не ясно, что происходит с методом печати в этом случае и почему он показывает такое вводящее в заблуждение представление данных.
ИЗМЕНИТЬ
Другие примеры, когда класс Date неожиданно падает, подвергая базовый тип числовой базы:
vapply(list(Sys.Date()), I, Sys.Date())
vapply(list(Sys.Date()), lubridate::as_date, Sys.Date())
и мой любимый до сих пор:
unlist(list(Sys.Date()))
Похоже, что векторные операции с Date
(и объектами POSIX) являются хрупкими; следует сосредоточиться на mode
/typeof
, а не class
, чтобы предвидеть, как будет вести себя вектор.