[R-pkg-devel] Order of repo access from options("repos")

Greg Hunt greg @end|ng |rom ||rm@n@y@h@com
Sun Mar 31 12:55:16 CEST 2024


When I set multiple repositories in options(repos=...) the order of access
is providing me with some surprises as I work through some CICD issues:

Given:

options(
   repos = c(
     CRAN = "http://localhost:3001/proxy",
     C = "http://172.17.0.1:3002",
     B = "http://172.17.0.1:3001/proxy",
     A = "http://localhost:3002"
   )
)


the order in the build log after this is :

#12 178.7 Warning: unable to access index for repository
http://localhost:3001/proxy/src/contrib:
#12 178.7   cannot open URL '
http://localhost:3001/proxy/src/contrib/PACKAGES'
#12 178.7 Warning: unable to access index for repository
http://172.17.0.1:3002/src/contrib:
#12 178.7   cannot open URL 'http://172.17.0.1:3002/src/contrib/PACKAGES'
#12 178.9 Warning: unable to access index for repository
http://localhost:3002/src/contrib:
#12 178.9   cannot open URL 'http://localhost:3002/src/contrib/PACKAGES'
#12 179.0 trying URL '
http://172.17.0.1:3001/proxy/src/contrib/png_0.1-8.tar.gz'
#12 179.1 Content type 'application/x-gzip' length 24880 bytes (24 KB)


Which indicates that the order is:

CRAN, C, A, B...

note that A comes before B in the URL accesses when I was expecting either
CRAN, C, B, A if its is physical order, or alphabetically would be A, B, C,
CRAN.

As an alternative, given:

options(
repos = c(
C = "http://172.17.0.1:3002",
B = "http://172.17.0.1:3001/proxy",
A = "http://localhost:3002",
CRAN = "http://localhost:3001/proxy"
)
)


The order is:

#12 0.485 Warning: unable to access index for repository
http://172.17.0.1:3002/src/contrib:
#12 0.485   cannot open URL 'http://172.17.0.1:3002/src/contrib/PACKAGES'
#12 1.153 Warning: unable to access index for repository
http://localhost:3002/src/contrib:
#12 1.153   cannot open URL 'http://localhost:3002/src/contrib/PACKAGES'
#12 1.153 Warning: unable to access index for repository
http://localhost:3001/proxy/src/contrib:
#12 1.153   cannot open URL '
http://localhost:3001/proxy/src/contrib/PACKAGES'
#12 1.250 trying URL '
http://172.17.0.1:3001/proxy/src/contrib/rlang_1.1.3.tar.gz'


Which seems to be C, A, CRAN, B.

What is it about B?

The help doesn't talk about this.  It says:

repos:
character vector of repository URLs for use by available.packages and
related functions. Initially set from entries marked as default in the
‘repositories’ file, whose path is configurable via environment variable
R_REPOSITORIES (set this to NULL to skip initialization at startup). The
‘factory-fresh’ setting from the file in R.home("etc") is c(CRAN="@CRAN@"),
a value that causes some utilities to prompt for a CRAN mirror. To avoid
this do set the CRAN mirror, by something like


local({
    r <- getOption("repos")
    r["CRAN"] <- "https://my.local.cran"
    options(repos = r)
})
in your ‘.Rprofile’, or use a personal ‘repositories’ file.


Note that you can add more repositories (Bioconductor, R-Forge, RForge.net,
...) for the current session using setRepositories.


Now I am not setting the values in exactly the way that the manual says, so
I experimented in case something was wrong there:

 options('repos')$repos
                         CRAN
"https://cloud.r-project.org"
> local({+     r <- getOption("repos")+     r["CRAN"] <- "https://my.local.cran"+     options(repos = r)+ })> options('repos')$repos
                   CRAN
"https://my.local.cran"
> str(options('repos'))List of 1
 $ repos: Named chr "https://my.local.cran"
  ..- attr(*, "names")= chr "CRAN"> local({+     r <-
getOption("repos")+     r["CRAN"] <- "https://my.local.cran"+
options(repos = r)+ })> options(+     repos = c(+         C =
"http://172.17.0.1:3002",+         B =
"http://172.17.0.1:3001/proxy",+         A = "http://localhost:3002",+
        CRAN = "http://localhost:3001/proxy"+     )+ )>
options('repos')$repos
                             C                              B
                    A                           CRAN
      "http://172.17.0.1:3002" "http://172.17.0.1:3001/proxy"
"http://localhost:3002"  "http://localhost:3001/proxy"
> str(options('repos'))List of 1
 $ repos: Named chr [1:4] "http://172.17.0.1:3002"
"http://172.17.0.1:3001/proxy" "http://localhost:3002"
"http://localhost:3001/proxy"
  ..- attr(*, "names")= chr [1:4] "C" "B" "A" "CRAN"> local({+     r
<- getOption("repos")+     r["CRAN"] <- "https://my.local.cran"+
r["C"] = "http://172.17.0.1:3002"+     r["B"] =
"http://172.17.0.1:3001/proxy"+     r["A"] = "http://localhost:3002"+
   r["CRAN"] = "http://localhost:3001/proxy"+     options(repos = r)+
})> > str(options('repos'))List of 1
 $ repos: Named chr [1:4] "http://172.17.0.1:3002"
"http://172.17.0.1:3001/proxy" "http://localhost:3002"
"http://localhost:3001/proxy"
  ..- attr(*, "names")= chr [1:4] "C" "B" "A" "CRAN"> options('repos')$repos
                             C                              B
                    A                           CRAN
      "http://172.17.0.1:3002" "http://172.17.0.1:3001/proxy"
"http://localhost:3002"  "http://localhost:3001/proxy"


So I don't think I am doing anything obviously accidentally weird there.
The RStudio documentation talks about this issue directly, but I'm
scripting R not RStudio and the behaviour appears to be different anyway.

What is the expected behaviour when there are multiple repositories?  Is
there a deterministic ordering?  Do the names have an effect?


Greg

	[[alternative HTML version deleted]]



More information about the R-package-devel mailing list