51 lines
1.6 KiB
R
51 lines
1.6 KiB
R
# Load necessary libraries
|
|
library(httr2)
|
|
library(dplyr)
|
|
library(tidyr)
|
|
library(xml2)
|
|
library(tools)
|
|
library(future)
|
|
library(future.apply)
|
|
|
|
# Define the base URL for the CRAN archive
|
|
base_url <- "https://cran.r-project.org/src/contrib/Archive/"
|
|
|
|
# Function to get all package names using tools::CRAN_package_db()
|
|
get_package_names <- function() {
|
|
cran_db <- CRAN_package_db()
|
|
package_names <- unique(cran_db$Package)
|
|
return(package_names)
|
|
}
|
|
|
|
# Function to get all archived versions of a package with error handling
|
|
get_archived_versions <- function(package_name) {
|
|
package_url <- paste0(base_url, package_name, "/")
|
|
|
|
# Try to perform the request and handle any errors
|
|
tryCatch({
|
|
response <- request(package_url) %>% req_perform()
|
|
page <- response %>% resp_body_string() %>% read_html()
|
|
version_links <- page %>% xml_find_all("//a") %>% xml_attr("href")
|
|
# Extract version numbers
|
|
versions <- gsub(paste0(package_name, "_|\\.tar\\.gz"), "", version_links)
|
|
# Filter out invalid version strings
|
|
versions <- versions[grep("^[0-9]+\\.[0-9]+\\.[0-9]+$", versions)]
|
|
return(data.frame(Package = package_name, Version = versions, stringsAsFactors = FALSE))
|
|
}, error = function(e) {
|
|
# If there's an error (e.g., HTTP 404), return NULL
|
|
return(NULL)
|
|
})
|
|
}
|
|
|
|
# Get all package names
|
|
package_names <- get_package_names()
|
|
|
|
# Set up parallel processing
|
|
plan(multisession, workers = parallel::detectCores())
|
|
|
|
# Get archived versions for all packages in parallel
|
|
all_packages_df <- future_lapply(package_names, get_archived_versions) %>%
|
|
bind_rows()
|
|
|
|
# Display the dataframe
|
|
print(all_packages_df)
|