[R-gregmisc-users] SF.net SVN: r-gregmisc:[1769] trunk/gtools
Brought to you by:
warnes
From: <wa...@us...> - 2014-02-11 17:14:12
|
Revision: 1769 http://sourceforge.net/p/r-gregmisc/code/1769 Author: warnes Date: 2014-02-11 17:14:08 +0000 (Tue, 11 Feb 2014) Log Message: ----------- Add getDependencies() function to return a list of package dependencies. Modified Paths: -------------- trunk/gtools/DESCRIPTION trunk/gtools/NAMESPACE Added Paths: ----------- trunk/gtools/R/clean_up_dependencies2.R trunk/gtools/R/getDependencies.R trunk/gtools/man/getDependencies.Rd Modified: trunk/gtools/DESCRIPTION =================================================================== --- trunk/gtools/DESCRIPTION 2014-01-14 19:43:17 UTC (rev 1768) +++ trunk/gtools/DESCRIPTION 2014-02-11 17:14:08 UTC (rev 1769) @@ -1,8 +1,8 @@ Package: gtools Title: Various R programming tools Description: Various R programming tools -Version: 3.2.2 -Date: 2014-01-14 +Version: 3.3.0 +Date: 2014-02-11 Author: Gregory R. Warnes, Ben Bolker, and Thomas Lumley Maintainer: Gregory R. Warnes <gr...@wa...> License: LGPL-2.1 Modified: trunk/gtools/NAMESPACE =================================================================== --- trunk/gtools/NAMESPACE 2014-01-14 19:43:17 UTC (rev 1768) +++ trunk/gtools/NAMESPACE 2014-02-11 17:14:08 UTC (rev 1769) @@ -13,6 +13,7 @@ even, foldchange, foldchange2logratio, + getDependencies, inv.logit, invalid, keywords, Added: trunk/gtools/R/clean_up_dependencies2.R =================================================================== --- trunk/gtools/R/clean_up_dependencies2.R (rev 0) +++ trunk/gtools/R/clean_up_dependencies2.R 2014-02-11 17:14:08 UTC (rev 1769) @@ -0,0 +1,68 @@ +.clean_up_dependencies2 <- function (x, installed, available) +{ + .split_dependencies <- function(x) { + .split2 <- function(x) { + x <- sub("[[:space:]]+$", "", x) + x <- unique(sub("^[[:space:]]*(.*)", "\\1", x)) + names(x) <- sub("^([[:alnum:].]+).*$", "\\1", x) + x <- x[names(x) != "R"] + x <- x[nzchar(x)] + x <- x[!duplicated(names(x))] + lapply(x, tools:::.split_op_version) + } + if (!any(nzchar(x))) + return(list()) + unlist(lapply(strsplit(x, ","), .split2), FALSE, FALSE) + } + x <- x[!is.na(x)] + if (!length(x)) + return(list(character(), character())) + xx <- .split_dependencies(x) + if (!length(xx)) + return(list(character(), character())) + pkgs <- installed[, "Package"] + have <- sapply(xx, function(x) { + if (length(x) == 3L) { + if (!x[[1L]] %in% pkgs) + return(FALSE) + if (x[[2L]] != ">=") + return(TRUE) + current <- as.package_version(installed[pkgs == x[[1L]], + "Version"]) + target <- as.package_version(x[[3L]]) + eval(parse(text = paste("any(current", x$op, "target)"))) + } + else x[[1L]] %in% pkgs + }) + xx <- xx[!have] + if (!length(xx)) + return(list(character(), character())) + pkgs <- row.names(available) + canget <- miss <- character() + for (i in seq_along(xx)) { + x <- xx[[i]] + if (length(x) == 3L) { + if (!x[[1L]] %in% pkgs) { + miss <- c(miss, x[[1L]]) + next + } + if (x[[2L]] != ">=") { + canget <- c(canget, x[[1L]]) + next + } + current <- as.package_version(available[pkgs == x[[1L]], + "Version"]) + target <- as.package_version(x[[3L]]) + res <- eval(parse(text = paste("any(current", x$op, + "target)"))) + if (res) + canget <- c(canget, x[[1L]]) + else miss <- c(miss, paste0(x[[1L]], " (>= ", x[[3L]], + ")")) + } + else if (x[[1L]] %in% pkgs) + canget <- c(canget, x[[1L]]) + else miss <- c(miss, x[[1L]]) + } + list(canget, miss) +} Added: trunk/gtools/R/getDependencies.R =================================================================== --- trunk/gtools/R/getDependencies.R (rev 0) +++ trunk/gtools/R/getDependencies.R 2014-02-11 17:14:08 UTC (rev 1769) @@ -0,0 +1,96 @@ +## This function determines the dependencies for the specified +## package, exluding only packages found in "base". +getDependencies <- function (pkgs, + dependencies = c("Depends", "Imports", "LinkingTo"), + installed=TRUE, + available=TRUE, + base=FALSE, + recommended=FALSE) +{ + pkgs.in = pkgs + if (is.null(dependencies)) + return(unique(pkgs)) + dep2 <- c("Depends", "Imports", "LinkingTo") + + + if(installed && !available) + all.packages <- installed.packages() + else if (available && !installed) + all.packages <- available.packages() + else + all.packages <- as.matrix(smartbind(## + installed.packages(), + available.packages() + )) + rownames(all.packages) <- all.packages[,"Package"] + + p0 <- unique(pkgs) + miss <- !p0 %in% row.names(all.packages) + if (sum(miss)) { + warning(sprintf(ngettext(sum(miss), "package %s is not available (for %s)", + "packages %s are not available (for %s)"), paste(sQuote(p0[miss]), + collapse = ", "), sub(" *\\(.*", "", R.version.string)), + domain = NA, call. = FALSE) + if (sum(miss) == 1L && !is.na(w <- match(tolower(p0[miss]), + tolower(row.names(all.packages))))) { + warning(sprintf("Perhaps you meant %s ?", sQuote(row.names(all.packages)[w])), + call. = FALSE, domain = NA) + } + flush.console() + } + + ## Whether to exclude base and recommended packages + if(!base || !recommended) + { + priority <- NULL + if(!base) priority <- c("base", priority) + if(!recommended) priority <- c("recommended", priority) + installed <- installed.packages(priority=priority) + } + else + installed <- installed.packages()[FALSE,] + + p0 <- p0[!miss] + + p1 <- p0 + not_avail <- character() + repeat { + deps <- apply(all.packages[p1, dependencies, drop = FALSE], + 1L, function(x) paste(x[!is.na(x)], collapse = ", ")) + + res <- .clean_up_dependencies2( + deps, + installed=installed, + all.packages) + not_avail <- c(not_avail, res[[2L]]) + deps <- unique(res[[1L]]) + deps <- deps[!deps %in% c("R", pkgs)] + if (!length(deps)) + break + pkgs <- c(deps, pkgs) + p1 <- deps + if (!is.null(dep2)) { + dependencies <- dep2 + dep2 <- NULL + } + } + if (length(not_avail)) { + not_avail <- unique(not_avail) + warning(sprintf(ngettext(length(not_avail), + "dependency %s is not available", + "dependencies %s are not available"), + paste(sQuote(not_avail), + collapse = ", ")), + domain = NA, + call. = FALSE, + immediate. = TRUE) + flush.console() + } + pkgs <- unique(pkgs) + pkgs <- pkgs[pkgs %in% row.names(all.packages)] + p0 <- pkgs + + + p0[ ! p0 %in% pkgs.in ] +} + Added: trunk/gtools/man/getDependencies.Rd =================================================================== --- trunk/gtools/man/getDependencies.Rd (rev 0) +++ trunk/gtools/man/getDependencies.Rd 2014-02-11 17:14:08 UTC (rev 1769) @@ -0,0 +1,81 @@ +\name{getDependencies} +\alias{getDependencies} +\title{ + Get package dependencies +} +\description{ + Get package dependencies +} +\usage{ +getDependencies(pkgs, + dependencies=NA, + installed=TRUE, + available=TRUE, + base=FALSE, + recommended=FALSE) +} +\arguments{ + \item{pkgs}{character vector of package names} + \item{dependencies}{character vector of dependency types to include. + Choices are "Depends", "Imports", "LinkingTo", "Suggests", + and "Enhances". Defaults to \code{c("Depends", "Imports", + "LinkingTo")}. + } + \item{installed}{Logical indicating whether to pull dependency + information from installed packages. Defaults to TRUE. + } + \item{available}{Logical indicating whether to pull dependency + information from available packages. Defaults to TRUE. + } + \item{base}{Logical indicating whether to include dependencies on base + packages that are included in the R installation. Defaults to + FALSE. + } + \item{base}{Logical indicating whether to include dependencies on + recommended packages that are included in the R + installation. Defaults to + FALSE. + } +} +\details{ + This function recursively constructs the list of dependencies for the + packages given by \code{pkgs}. By default, the dependency information + is extracted from both installed and available packages. As a + consequence, it works both for local and CRAN packages. +} +\value{ + A character vector of package names. +} +\note{ + If \code{available=TRUE} R will attempt to access the currently + selected CRAN repository, prompting for one if necessary. + } +\author{ + Gregory R. Warnes email{gr...@wa...} based on the non exported + \code{utils:::getDependencies} and + \code{utils:::.clean_up_dependencies2}. +} +\seealso{ + \code{\link{installed.packages}}, + \code{\link{available.packages}} +} +\examples{ +## A locally installed package +getDependencies("MASS", installed=TRUE, available=FALSE) + +\dontrun{ +## A package on CRAN +getDependencies("gregmisc", installed=FALSE, available=TRUE) +} + +## Show base and recommended dependencies +getDependencies("MASS", available=FALSE, base=TRUE, recommended=TRUE) + +\dontrun{ +## Download the set of packages necessary to support a local package +deps <- getDependencies("MyLocalPackage", available=FALSE) +download.packages(deps, destdir="./R_Packages") +} + +} +\keyword{utilities} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |