23  网络分析

23.1 R 语言社区规模

从 CRAN 上的 R 包及其开发者数量来看看目前 R 语言社区规模。

# 设置就近的 CRAN 镜像站点
Sys.setenv(R_CRAN_WEB = "https://mirrors.tuna.tsinghua.edu.cn/CRAN")
# 获取 R 包元数据
pdb <- tools::CRAN_package_db()

截止 2022-12-31 CRAN 上发布的 R 包有 18976 个,CRAN 进入年末维护期 2022-12-22 至 2023-01-05。

pdb <- subset(x = pdb, subset = !duplicated(Package), 
              select = c("Package", "Maintainer", "License", 
                         "Title", "Date", "Published"))

距离上次更新的时间分布,有的包是一周内更新的,也有的是 10 多年未更新的。

pdb$date_diff <- as.integer(as.Date("2022-12-31") - as.Date(pdb$Published))

根据发布日期 Published 构造新的一列 — 发布年份。

pdb$published_year <- as.integer(format(as.Date(pdb$Published), "%Y"))

然后按年统计更新的 R 包数量,如 图 23.1 所示,过去 1 年内更新的 R 包有 8112 个(包含新出现的 R 包),占总数 8112 / 18976 = 42.75%,过去 2 年内更新的 R 包有 11553 个,占总数 11553 / 18976 = 60.88%,这个占比越高说明社区开发者越活跃。还可以换个说法,以 2020 年为例,总数 18976 个 R 包当中有 2470 个 R 包的更新日期停留在 2020 年,占比 2470 / 18976 = 13.02%。

library(ggplot2)
aggregate(data = pdb,Package ~ published_year, FUN = length) |> 
  ggplot(aes(x = published_year, y = Package)) +
  geom_col(fill = NA, color = "gray20") +
  theme_classic() +
  coord_cartesian(expand = F) +
  labs(x = "年份", y = "R 包数量")

图 23.1: CRAN 上 R 包的更新情况

截止 2022-12-31,CRAN 上 R 包的维护者有 10049 人,其中有多少人在 2022 年更新了自己的 R 包呢?有 4820 个维护者,占比 47.96%,也就是说 2022 年,有 4820 个开发者更新了 8112 个 R 包,人均更新 1.68 个 R 包,下 图 23.2 按 R 包发布年份统计开发者数量。

# 清理维护者字段,同一个开发者可能有多个邮箱
pdb$Maintainer2 <- sub(pattern = "<.*?>", replacement = "", x = pdb$Maintainer)
pdb$Maintainer2 <- trimws(pdb$Maintainer2, which = "both", whitespace = "[ \t\r\n]")
pdb$Maintainer2 <- tolower(pdb$Maintainer2)
# 维护者总数
# length(unique(pdb$Maintainer2))

aggregate(
  data = pdb, Maintainer2 ~ published_year,
  FUN = function(x) {
    length(unique(x))
  }
) |>
  ggplot(aes(x = published_year, y = Maintainer2)) +
  geom_col(fill = NA, color = "gray20") +
  theme_classic() +
  coord_cartesian(expand = F) +
  labs(x = "年份", y = "开发者数量")

图 23.2: CRAN 上的维护者活跃情况