11install_required_packages <- function (lib = NULL , repos = getOption(" repos" , default = c(CRAN = " https://cran.rstudio.com/" ))) {
22
33 if (is.null(lib )) {
4- lib <- .libPaths()
4+ lib <- .libPaths()[[ 1 ]]
55 }
66
77 message(" lib paths: " , paste(lib , collapse = " , " ))
8- required_pkgs <- c(" rprojroot" , " desc" , " remotes" , " renv" )
8+ # Note: RMarkdown is needed for renv to detect packages in Rmd documents.
9+ required_pkgs <- c(" rprojroot" , " desc" , " remotes" , " renv" , " BiocManager" , " rmarkdown" )
910 installed_pkgs <- rownames(installed.packages(lib.loc = lib ))
1011 missing_pkgs <- setdiff(required_pkgs , installed_pkgs )
1112
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
14- # mirror here.
13+ # The default installation of R will have "@CRAN@" as the default repository,
14+ # which directs contrib.url() to either force the user to choose a mirror if
15+ # interactive or fail if not. Since we are not interactve, we need to force
16+ # the mirror here.
1517 if (" @CRAN@" %in% repos ) {
1618 repos <- c(CRAN = " https://cran.rstudio.com/" )
1719 }
@@ -29,30 +31,73 @@ find_root <- function() {
2931 root
3032}
3133
34+ # set the BiocManager repositories and return a function that resets the default
35+ # repositories.
36+ #
37+ # @example
38+ # bioc_repos_example <- function() {
39+ # message("User repos")
40+ # as.data.frame(getOption("repos"))
41+ # reset_repos <- use_bioc_repos()
42+ # on.exit(reset_repos())
43+ # message("Bioc repos")
44+ # as.data.frame(getOption("repos"))
45+ # }
46+ # bioc_repos_example()
47+ # as.data.frame(getOption("repos")
48+ use_bioc_repos <- function () {
49+ repos <- getOption(" repos" )
50+ suppressMessages(options(repos = BiocManager :: repositories()))
51+ function () {
52+ options(repos = repos )
53+ }
54+ }
55+
3256identify_dependencies <- function () {
3357
3458 root <- find_root()
3559
60+ reset_repos <- use_bioc_repos()
61+ on.exit(reset_repos(), add = TRUE )
62+ eps <- file.path(root , " _episodes_rmd" )
63+ bin <- file.path(root , " bin" )
64+
3665 required_pkgs <- unique(c(
3766 # # Packages for episodes
38- renv :: dependencies(file.path( root , " _episodes_rmd " ), progress = FALSE , error = " ignore " )$ Package ,
67+ renv :: dependencies(eps , progress = FALSE , error = " ignored " )$ Package ,
3968 # # Packages for tools
40- renv :: dependencies(file.path( root , " bin" ) , progress = FALSE , error = " ignore " )$ Package
69+ renv :: dependencies(bin , progress = FALSE , error = " ignored " )$ Package
4170 ))
4271
4372 required_pkgs
4473}
4574
4675create_description <- function (required_pkgs ) {
4776 d <- desc :: description $ new(" !new" )
48- lapply( required_pkgs , function ( x ) d $ set_dep( x ))
77+ d $ set_deps( data.frame ( type = " Imports " , package = required_pkgs , version = " * " ))
4978 d $ write(" DESCRIPTION" )
79+ # We have to write the description twice to get the hidden dependencies
80+ # because renv only considers explicit dependencies.
81+ #
82+ # This is needed because some of the hidden dependencis will require system
83+ # libraries to be configured.
84+ suppressMessages(repo <- BiocManager :: repositories())
85+ deps <- remotes :: dev_package_deps(dependencies = TRUE , repos = repo )
86+ deps <- deps $ package [deps $ diff < 0 ]
87+ if (length(deps )) {
88+ # only create new DESCRIPTION file if there are dependencies to install
89+ d $ set_deps(data.frame (type = " Imports" , package = deps , version = " *" ))
90+ d $ write(" DESCRIPTION" )
91+ }
5092}
5193
5294install_dependencies <- function (required_pkgs , ... ) {
5395
96+ reset_repos <- use_bioc_repos()
97+ on.exit(reset_repos(), add = TRUE )
98+
5499 create_description(required_pkgs )
55- on.exit(file.remove(" DESCRIPTION" ))
100+ on.exit(file.remove(" DESCRIPTION" ), add = TRUE )
56101 remotes :: install_deps(dependencies = TRUE , ... )
57102
58103 if (require(" knitr" ) && packageVersion(" knitr" ) < ' 1.9.19' ) {
0 commit comments