I am developing a package that requires the namespace of another package, OpenMx. This package is only available from it's own repository, but specifying this repository in the Additional_repositories field does not work. When trying to build my package without OpenMx installed, I get:
ERROR: dependency 'OpenMx' is not available for blah blah
Is there a problem with my description, or something else I need to be doing?
The relevant piece of my description file:
Depends: R (>= 3.0.0)
Imports: MASS, OpenMx (>= 2.0)
Additional_repositories: http://openmx.psyc.virginia.edu/OpenMx2/
LazyData: Yes
VignetteBuilder: knitr
Suggests: knitr
Log from a build attempt:
Thu Apr 2 18:08:10 2015: Building tarball for package ctsem (SVN revision 5)
using R version 3.1.3 Patched (2015-03-16 r67994) ...
* checking for file ‘ctsem/DESCRIPTION’ ... OK
* preparing ‘ctsem’:
* checking DESCRIPTION meta-information ... OK
* installing the package to build vignettes
-----------------------------------
* installing *source* package ‘ctsem’ ...
** R
** data
*** moving datasets to lazyload DB
** inst
** preparing package for lazy loading
Error in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck = vI[[i]]) :
there is no package called ‘OpenMx’
ERROR: lazy loading failed for package ‘ctsem’
* removing ‘/tmp/RtmpAHPlFq/Rinst5272759a2048/ctsem’
-----------------------------------
ERROR: package installation failed
Run time: 1.09 seconds.
AFAIK Additional_repositories
is still a free-form field and not automatically added to the options("repos")
consulted by download.packages()
and hence install.packages()
or update.packages()
.
For the very problem of adding repos beyond CRAN, I wrote a little helper package drat which a few people, myself included, use to host repos either on GitHub (a "default" mode as it is so easy via gh-pages
) or any other http-accessible server---ie local servers within a company or workgroup. Drat does nothing particularly difficult, but for this default case of adding a repository of user, say, openmx
, all you need is drat::addRepo("openmx")
and the rest is inferred from defaults (and assumes a drat
repo in account openmx
exists).
I deploy both use cases: newer packages via repos at GitHub, and a work-local repo.
Edit: But WRE says
The 'Addiitonal_repositories' field is a comma-separated list of
repository URLs where the packages named in the other fields may be
found. It is currently used by 'R CMD check' to check that the
packages can be found, at least as source packages (which can be
installed on any platform).
which implies it looks there. Odd. And the repo looks legit at the given URL.
Edit 2: And I sent a patch to R Core for the typo in the above quote.
See: http://thecoatlessprofessor.com/programming/r-data-packages-in-external-data-repositories-using-the-additional_repositories-field/
Specifically, note that you can specify:
if (!requireNamespace("namepackage", quietly = TRUE)) {
install.packages("namepackage", repos = "http://location-of.com/repo")
}
To auto add the repo on package load, use:
.onLoad <- function(libname) {
repos = getOption("repos")
repos["<NAME_REPO>"] = "http://location-of.com/repo"
options(repos = repos)
invisible(repos)
}
This negates the need to set repos = ...
in install.packages()
.
So it appears that the Additional_repositories field is only used to check the existence of any suggested packages, but they are not actually loaded, and hence if any examples or vignettes use these packages, the build process will break. I have worked around the problem for now by setting examples to not run and including a pre-built vignette instead.