[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.
|