Я заметил, что вызов c.Date () для инициализации пустого вектора даты вызывает предупреждение. Я использую R версии 3.4.0.
Предупреждающее сообщение:
Warning message: In structure(c(unlist(lapply(list(...), unclass))), class = "Date") : Calling 'structure(NULL, *)' is deprecated, as NULL cannot have attributes. Consider 'structure(list(), *)' instead.
У кого-нибудь есть объяснение? Как инициализировать пустой вектор DATE без этого предупреждения?
Воспроизводимый код:
vect = c.Date()
d = as.Date("31/12/2018", format = "%d/%m/%Y")
for(i in 1:10){
vect = c(vect, d)
d = d+1
}
print(vect)
Результат
[1] "2016-03-31" "2016-04-01" "2016-04-02" "2016-04-03" [5] "2016-04-04" "2016-04-05" "2016-04-06" "2016-04-07" [9] "2016-04-08" "2016-04-09"
Если я использую не c.Date (), а c ().
vect = c()
d = as.Date("31/12/2018", format = "%d/%m/%Y")
for(i in 1:10){
vect = c(vect, d)
d = d+1
}
print(vect)
[1] 17896 17897 17898 17899 17900 17901 17902 17903 17904 17905
что нежелательно.
Очень хорошо работает, спасибо. Я бы предпочел более элегантный способ определения этого, но я очень доволен вашим ответом.
Вы также можете использовать suppressWarnings(c.Date())
. Но, пожалуй, лучше всего это vect <- as.Date("31/12/2018", format = "%d/%m/%Y") + 1:10
, не требующий цикла или пустого вектора.
Еще раз спасибо r2evans, suppressWarnings () тоже работает. Я использую его в цикле и стараюсь, чтобы он был чистым и читаемым, избегая инициализации первой итерации цикла. Что меня удивляет, так это то, что R почему-то устарел c.Date () и не предлагает прямого способа инициализировать пустой вектор даты.
Я понимаю вашу жалобу, и единственное, что я могу предложить, это то, что я редко инициализирую пустой вектор или список чего-либо, вместо этого решая создать его как возвращаемое значение из одной из функций *apply
. Раньше они были значительно быстрее, чем петли for
(все еще может быть, в зависимости от вашего использования). С другой стороны, итеративное добавление к вектору или списку может иметь ужасную производительность; это может быть хорошо для нескольких десятков, но с большими объектами или их большим количеством каждый проход цикла будет медленнее в долгосрочной перспективе. Неизбежно, так работает управление памятью (в R).
r2evans ответил на мой вопрос.
Sys.Date()[0]
делает свое дело.
Я публикую здесь, чтобы отметить его решенным для будущих читателей.
Sys.Date()[0]