R/packageLog.R

Defines functions packageLog

Documented in packageLog

#' Get Package Download Logs.
#'
#' From RStudio's CRAN Mirror http://cran-logs.rstudio.com/
#' @param packages Character. Vector of package name(s).
#' @param date Character. Date. "yyyy-mm-dd". NULL uses latest available log.
#' @param all.filters Logical. Master switch for filters.
#' @param ip.filter Logical.
#' @param triplet.filter Logical.
#' @param small.filter Logical. TRUE filters out downloads less than 1000 bytes.
#' @param sequence.filter Logical.
#' @param size.filter Logical.
#' @param memoization Logical. Use memoization when downloading logs.
#' @param check.package Logical. Validate and "spell check" package.
#' @param multi.core Logical or Numeric. \code{TRUE} uses \code{parallel::detectCores()}. \code{FALSE} uses one, single core. You can also specify the number logical cores. Mac and Unix only.
#' @param dev.mode Logical. Development mode uses parallel::parLapply().
#' @return An R data frame.
#' @export

packageLog <- function(packages = "cholera", date = NULL, all.filters = FALSE,
  ip.filter = FALSE, triplet.filter = FALSE, small.filter = FALSE,
  sequence.filter = FALSE, size.filter = FALSE, memoization = TRUE,
  check.package = TRUE, multi.core = TRUE, dev.mode = FALSE) {

  if (!curl::has_internet()) stop("Check internet connection.", call. = FALSE)
  if (check.package) packages <- checkPackage(packages)
  file.url.date <- logDate(date)
  cran_log <- fetchCranLog(date = file.url.date, memoization = memoization)
  cran_log <- cleanLog(cran_log)

  ymd <- rev_fixDate_2012(file.url.date)
  cores <- multiCore(multi.core)

  if (all.filters) {
    ip.filter <- TRUE
    triplet.filter <- TRUE
    small.filter <- TRUE
    sequence.filter <- TRUE
    size.filter <- TRUE
  }

  pkg_specific_filters <- c(triplet.filter, sequence.filter, size.filter)

  if (ip.filter) {
    cran_log <- ipFilter(cran_log, multi.core = cores, dev.mode = dev.mode)
  }

  unobs.pkgs <- !packages %in% cran_log$package
  if (any(unobs.pkgs)) pkg.msg <- paste(packages[unobs.pkgs], collapse = ", ")

  if (all(unobs.pkgs)) {
    stop("No downloads for ", pkg.msg, " on ", ymd, ".", call. = FALSE)
  } else if (any(unobs.pkgs)) {
    message("No downloads for ", pkg.msg, " on ", ymd, ".")
    packages <- packages[!unobs.pkgs]
  }

  if (.Platform$OS.type == "windows") {
    out <- lapply(packages, function(p) {
      cran_log[cran_log$package == p, ]
    })
  } else {
    out <- parallel::mclapply(packages, function(p) {
      cran_log[cran_log$package == p, ]
    }, mc.cores = cores)
  }

  if (any(pkg_specific_filters)) {
    if (triplet.filter) {
      out <- tripletFilter(out, multi.core = cores, dev.mode = dev.mode)
    }

    if (small.filter) {
      out <- smallFilter(out, multi.core = cores, dev.mode = dev.mode)
    }

    if (sequence.filter) {
      out <- sequenceFilter(out, packages, ymd, cores, dev.mode = dev.mode)
    }

    if (size.filter) {
      out <- sizeFilter(out, packages, cores, dev.mode = dev.mode)
    }
  } else {
    if (small.filter) {
      out <- smallFilter(out, multi.core = cores, dev.mode = dev.mode)
    }
  }

  if (.Platform$OS.type == "windows") {
    out <- lapply(out, function(x) {
      if (!"t2" %in% names(x)) x$date.time <- dateTime(x$date, x$time)
      tmp <- x[order(x$date.time), ]
      tmp$date.time <- NULL
      tmp
    })
  } else {
    out <- parallel::mclapply(out, function(x) {
      if (!"t2" %in% names(x)) x$date.time <- dateTime(x$date, x$time)
      tmp <- x[order(x$date.time), ]
      tmp$date.time <- NULL
      tmp
    }, mc.cores = cores)
  }

  pkgs.survived <- vapply(out, function(x) x[1, "package"], character(1L))
  pkg.not_survived <- setdiff(packages, pkgs.survived)

  if (length(pkg.not_survived) > 0) {
    message("No filtered downloads for ", paste(pkg.not_survived, 
      collapse = ", "), ".")
  }
  
  names(out) <- pkgs.survived
  
  if (length(packages) == 1) {
    out[[1]]
  } else {
    out
  }
}

Try the packageRank package in your browser

Any scripts or data that you put into this service are public.

packageRank documentation built on Nov. 10, 2023, 1:07 a.m.