计算从公元1年到现在的回文日期的数量:
所谓回文日期,就是日期数字正反完全相同,例如2020年2月2日。

library(lubridate)
library(stringr)
library(tidyverse)

首先我们设定“公元0001年1月1日”和“5001年1月1日”:

start_date <- ymd("0001/01/01")
end_date <- ymd("5001/01/01")

创建一个tibble,Date列包含所有日期

data <- tibble(Date = seq(start_date, end_date, by = 1))
head(data)
Date
0001-01-01
0001-01-02
0001-01-03
0001-01-04
0001-01-05
0001-01-06
data <- data %>%
  mutate(number = as.character(Date),
         # 删除开头的0
         number = gsub("^0*", "", number),
         number = gsub("-", "", number),
         number = str_split(number, ""))
head(data)
Date number
0001-01-01 1, 0, 1, 0, 1
0001-01-02 1, 0, 1, 0, 2
0001-01-03 1, 0, 1, 0, 3
0001-01-04 1, 0, 1, 0, 4
0001-01-05 1, 0, 1, 0, 5
0001-01-06 1, 0, 1, 0, 6

正反所有字符应该都一样:

flag <- map(data$number, 
    function(x)  {all(x == rev(x))}  )
flag <- unlist(flag)
# 然后切片就成了
result <- data %>%
  filter(flag)

result <- result %>%
  mutate(r = 1:nrow(result)) %>%
  select(r, Date)

head(result)
r Date
1 0001-01-01
2 0001-02-01
3 0001-03-01
4 0001-04-01
5 0001-05-01
6 0001-06-01

x轴是年份,r是累计有多少回文日期。
2021年12月2日是公元以来第513个。

ggplot(result) +
  geom_line(aes(x = Date, y = r), color = "#257eaa", size = 1.5, alpha = .8) + 
  annotate(geom = "point", x = ymd("20211202"), y = 513, colour = "#ff0d00", size = 3, alpha = .5) + 
  annotate("segment", x = ymd("20211202"), xend = ymd("20211202"), y = 0, yend = 513,
             colour = "#257eaa", alpha=0.6, linetype = 2) + 
  theme_minimal()