[Rd] .conflicts.OK no longer working regardless of export(.conflicts.OK) due to "stoplist"

Henrik Bengtsson hb at biostat.ucsf.edu
Fri Mar 9 06:09:20 CET 2012


Hi,

in (at least) R v2.14.2 and R v2.15.0 alpha, '.conflicts.OK' is not
exported and hence to seen by library().

DETAILS:
In R-devel thread '[Rd] Suggestion: Not having to export .conflicts.OK
in name spaces' on Mar 17-22, 2010
[https://stat.ethz.ch/pipermail/r-devel/2010-March/057017.html] it was
discussed that one had to export '.conflicts.OK' in the namespace,
otherwise it would not be found in the internal conflict test of
library(), cf. print(base::library):

...
if(warn.conflicts &&
                       !exists(".conflicts.OK", envir = env, inherits = FALSE))
                        checkConflicts(package, pkgname, pkgpath,
                                       nogenerics, ns)
...

By replacing envir=env with envir=ns, it will be found.  Here is what
I get if I use debug(library):

Browse[2]> exists(".conflicts.OK", envir=env, inherits=FALSE)
[1] FALSE
Browse[2]> exists(".conflicts.OK", envir=ns, inherits=FALSE)
[1] TRUE


This was never implemented, but export(.conflicts.OK) do the job.  So
far so good, but in rev 56711 (Aug 12, 2011) the following piece of
code was added to loadNamespace() [src/library/base/R/library.R],
which drops '.conflicts.OK' regardless:

        ## process exports, seal, and clear on.exit action
        exports <- nsInfo$exports

        for (p in nsInfo$exportPatterns)
            exports <- c(ls(env, pattern = p, all.names = TRUE), exports)
        ## certain things should never be exported.
        if (length(exports)) {
            stoplist <- c(".__NAMESPACE__.", ".__S3MethodsTable__.",
                          ".packageName", ".First.lib", ".onLoad",
                          ".onAttach", ".conflicts.OK", ".noGenerics")
            exports <- exports[! exports %in% stoplist]
        }


To confirm this is the problem one can load the package with
debug(loadNamespace), step through the function and after the above
"stoplist" filtering append '.conflicts.OK', e.g. exports <-
c(exports, ".conflicts.OK"), and '.conflicts.OK' is yet again visible
to library().

SOLUTION:
Thus, I propose to do the above 'envir=env' to 'envir=ns' update in
library() to fix this.

/Henrik

> sessionInfo()
R version 2.14.2 Patched (2012-02-29 r58590)
Platform: x86_64-pc-mingw32/x64 (64-bit)

> sessionInfo()
R version 2.15.0 alpha (2012-03-07 r58630)
Platform: x86_64-pc-mingw32/x64 (64-bit)



More information about the R-devel mailing list