library(dplyr)
library(tidyr)
library(stringr)
library(ggplot2)
theme_set(theme_bw())

pkgs <- available.packages() %>%
  as.data.frame() %>%
  tbl_df()

builtin <- c("stats", "methods", "utils", "graphics")

requirements <- pkgs %>%
  unite(Requires, Depends, Imports, Suggests, sep = ",") %>%
  transmute(Package = as.character(Package),
            Requires = as.character(Requires)) %>%
  unnest(Requires = str_split(Requires, ",")) %>%
  mutate(Requires = str_replace(Requires, "\n", "")) %>%
  mutate(Requires = str_trim(str_replace(Requires, "\\(.*", ""))) %>%
  filter(!(Requires %in% c("R", "NA", "", builtin)))

package_info <- requirements %>%
  count(Package = Requires) %>%
  rename(NRequiredBy = n) %>%
  left_join(count(requirements, Package)) %>%
  rename(NRequires = n) %>%
  replace_na(list(NRequires = 0))
library(widyr)

correlations <- requirements %>%
  group_by(Requires) %>%
  filter(n() >= 20) %>%
  ungroup() %>%
  pairwise_cor(Requires, Package, sort = TRUE)

correlations
## # A tibble: 64,262 x 3
##            item1         item2 correlation
##            <chr>         <chr>       <dbl>
## 1           R.oo   R.methodsS3   0.9031723
## 2    R.methodsS3          R.oo   0.9031723
## 3     doParallel       foreach   0.7356237
## 4        foreach    doParallel   0.7356237
## 5       timeDate    timeSeries   0.7084297
## 6     timeSeries      timeDate   0.7084297
## 7  gWidgetsRGtk2      gWidgets   0.6974278
## 8       gWidgets gWidgetsRGtk2   0.6974278
## 9           ergm       network   0.6336438
## 10       network          ergm   0.6336438
## # ... with 64,252 more rows
library(igraph)
library(ggraph)

cors <- correlations %>%
  filter(correlation > .2)

vertices <- package_info %>%
  filter(Package %in% cors$item1 |
           Package %in% cors$item2)

set.seed(2016)

graph_from_data_frame(cors, directed = FALSE, vertices) %>%
  ggraph(layout = "fr") +
  geom_edge_link(aes(edge_width = correlation, edge_alpha = correlation)) +
  geom_node_point(aes(size = NRequiredBy), color = "skyblue", show.legend = FALSE) +
  geom_node_text(aes(label = name), size = 3, check_overlap = TRUE, vjust = 1, hjust = 1) +
  scale_size_continuous(range = c(.5, 10)) +
  scale_edge_width(range = c(.5, 3)) +
  ggforce::theme_no_axes() +
  theme(legend.position = "none")