-
Notifications
You must be signed in to change notification settings - Fork 759
/
install.r
51 lines (40 loc) · 1.57 KB
/
install.r
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#' Install a local development package.
#'
#' Uses \code{R CMD INSTALL} to install the package. Will also try to install
#' dependencies of the package from CRAN, if they're not already installed.
#'
#' Installation takes place on a copy of the package produced by
#' \code{R CMD build} to avoid modifying the local directory in any way.
#'
#' @param pkg package description, can be path or package name. See
#' \code{\link{as.package}} for more information
#' @param reload if \code{TRUE} (the default), will automatically reload the
#' package after installing.
#' @param ... Other arguments passed on to \code{\link{install.packages}}.
#' @export
#' @family package installation
#' @importFrom utils install.packages
install <- function(pkg = NULL, reload = TRUE, ...) {
pkg <- as.package(pkg)
message("Installing ", pkg$package)
install_deps(pkg)
built_path <- build(pkg, tempdir())
on.exit(unlink(built_path))
R(paste("CMD INSTALL ", built_path, " --library=", shQuote(.libPaths()[1]),
sep = ""), tempdir())
if (reload) reload(pkg)
invisible(TRUE)
}
install_deps <- function(pkg = NULL) {
pkg <- as.package(pkg)
deps <- c(parse_deps(pkg$depends), parse_deps(pkg$imports),
parse_deps(pkg$linkingto))
# Remove packages that are already installed
not.installed <- function(x) length(find.package(x, quiet = TRUE)) == 0
deps <- Filter(not.installed, deps)
if (length(deps) == 0) return(invisible())
message("Installing dependencies for ", pkg$package, ":\n",
paste(deps, collapse = ", "))
install.packages(deps)
invisible(deps)
}