in R/R/sqlPackage.R [1122:1194]
getDependentPackagesToInstall <- function(pkgs, availablePackages, installedPackages, skipMissing = FALSE,
verbose = getOption("verbose"))
{
#
# prune requested packages to exclude base packages
#
basePackages <- installedPackages[installedPackages[,"Priority"] %in% c("base", "recommended"), c("Package", "Priority"), drop = FALSE]$Package
droppedPackages <- pkgs[pkgs %in% basePackages]
if (length(droppedPackages) > 0)
{
warning(sprintf("Skipping base packages (%s)", paste(droppedPackages, collapse = ', ')), call. = FALSE)
}
pkgs <- pkgs[!(pkgs %in% droppedPackages)]
if (length(pkgs) < 1)
{
return (NULL)
}
#
# get dependency closure for all given packages
# note: by default we obtain a package+dependencies from one CRAN which should have versions that work together without conflicts.
#
if (verbose)
{
write(sprintf("%s Resolving package dependencies for (%s)...", pkgTime(), paste(pkgs, collapse = ', ')), stdout())
}
dependencies <- tools::package_dependencies(packages = pkgs, db = availablePackages, recursive = TRUE, verbose = FALSE)
#
# get combined dependency closure w/o base packages
#
dependencies <- unique(unlist(c(dependencies, names(dependencies)), recursive = FALSE, use.names = FALSE))
dependencies <- dependencies[dependencies != "NA"]
dependencies <- dependencies[!(dependencies %in% basePackages)]
if (length(dependencies) < 1)
{
return (NULL)
}
#
# are there any missing packages in dependency closure?
#
availablePackageNames <- rownames(availablePackages)
missingPackages <- dependencies[!(dependencies %in% availablePackageNames)]
if (length(missingPackages) > 0)
{
missingPackagesStr <- sprintf("Missing dependency packages (%s)", paste(missingPackages, collapse = ', '))
if (!skipMissing)
{
stop(missingPackagesStr, call. = FALSE)
}
else
{
warning(missingPackagesStr, call. = FALSE)
}
}
#
# get the packages in order of dependency closure
#
dependencies <- unique(dependencies)
pkgsToInstall <- availablePackages[match(dependencies, availablePackageNames),]
pkgsToInstall <- pkgsToInstall[!is.na(pkgsToInstall$Package),]
return (pkgsToInstall)
}