1 install_required_packages <- function(lib = NULL, repos = getOption("repos", default = c(CRAN = "https://cran.rstudio.com/"))) {
7 message("lib paths: ", paste(lib, collapse = ", "))
8 missing_pkgs <- setdiff(
9 c("rprojroot", "desc", "remotes", "renv"),
10 rownames(installed.packages(lib.loc = lib))
12 # The default installation of R will have "@CRAN@" as the default repository, which directs contrib.url() to either
13 # force the user to choose a mirror if interactive or fail if not. Since we are not interactve, we need to force the
15 if ("@CRAN@" %in% repos) {
16 repos <- c(CRAN = "https://cran.rstudio.com/")
19 install.packages(missing_pkgs, lib = lib, repos = repos)
23 find_root <- function() {
25 cfg <- rprojroot::has_file_pattern("^_config.y*ml$")
26 root <- rprojroot::find_root(cfg)
31 identify_dependencies <- function() {
35 required_pkgs <- unique(c(
36 ## Packages for episodes
37 renv::dependencies(file.path(root, "_episodes_rmd"), progress = FALSE, error = "ignore")$Package,
39 renv::dependencies(file.path(root, "bin"), progress = FALSE, error = "ignore")$Package
45 create_description <- function(required_pkgs) {
46 d <- desc::description$new("!new")
47 lapply(required_pkgs, function(x) d$set_dep(x))
48 d$write("DESCRIPTION")
51 install_dependencies <- function(required_pkgs, ...) {
53 create_description(required_pkgs)
54 on.exit(file.remove("DESCRIPTION"))
55 remotes::install_deps(dependencies = TRUE, ...)
57 if (require("knitr") && packageVersion("knitr") < '1.9.19') {
58 stop("knitr must be version 1.9.20 or higher")