В этом решении используется пакет lubridate
. Код сначала проверяет, является ли дата в for
l oop действительной, и, если нет, вызывает вспомогательную функцию nextDate
.
nextDate <- function(y, m, d){
y <- as.integer(y)
m <- as.integer(m)
d <- as.integer(d)
days <- lubridate::days_in_month(paste(y, m, 1, sep = "-"))
as.Date(paste(y, m, min(days, d), sep = "-")) + 1L
}
date_month <- "2"
date_day <- "29"
# Loop by years
for(date_year in c("2020", "2021")) {
s_date <- paste0(date_year, "-", date_month, "-", date_day)
#
repeat{
date_selected <- tryCatch(as.Date(s_date, origin = "1970-01-01"),
error = function(e) e
)
if(inherits(date_selected, "error")){
s_date <- nextDate(date_year, date_month, date_day)
}else break
}
}
Посмотреть результат.
s_date
#[1] "2021-03-01"