On 10/04/2016 05:09 PM, Martin Morgan wrote:
On 10/04/2016 05:07 PM, McDavid, Andrew wrote:
BiocCheck throws a warning when a package is listed as Imports: in
DESCRIPTION but not used in the NAMESPACE.  This may happen when a
developer uses the fully qualified names of objects within a package.
I am unclear as to the rationale for this warning.


agree it's wrong. can you point to an example? Martin

I updated BiocCheck to be smarter about this; I'm not sure when this will propagate to the single package builder. It doesn't complain about Imports: in the DESCRIPTION file if the package is used in the NAMESPACE or :: or :::. The code is kind of fun, using the codetools package:

library(codetools)

.checkEnv <- function(env, walker) {
    ## look at all closures in 'env' using codetools-derived 'walker'
    for (n in ls(env, all.names = TRUE)) {
        v <- get(n, envir = env)
        if (typeof(v) == "closure")
            walkCode(body(v), walker)
    }
    walker
}

.colonWalker <- function() {
    ## record all pkg used as pkg::foo or pkg:::bar
    PKGS <- character()
    collector <- function(e, w)
        PKGS <<- append(PKGS, as.character(e[[2]]))
    list(handler=function(v, w) {
        switch(v, "::"=collector, ":::"=collector, NULL)
    }, call=function(e, w) {
        for (ee in as.list(e)) if (!missing(ee)) walkCode(ee, w)
    }, leaf = function(e, w) {
        NULL
    }, done = function() {
        sort(unique(PKGS))
    })
}

> library(codetools)
> .checkEnv(loadNamespace("IRanges"), .colonWalker())$done()
[1] "base"         "BiocGenerics" "S4Vectors"

Martin


Per Hadley:

It's common for packages to be listed in Imports in DESCRIPTION, but
not in NAMESPACE. In fact, this is what I recommend: list the package
in DESCRIPTION so that it's installed, then always refer to it
explicitly with pkg::fun(). Unless there is a strong reason not to,
it's better to be explicit. It's a little more work to write, but a
lot easier to read when you come back to the code in the future.

Per R extensions:

If a package only needs a few objects from another package it can use
a fully qualified variable reference in the code instead of a formal
import. A fully qualified reference to the function f in package foo
is of the form foo::f.

-Andrew


    [[alternative HTML version deleted]]

_______________________________________________
Bioc-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/bioc-devel



This email message may contain legally privileged and/or...{{dropped:2}}

_______________________________________________
Bioc-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/bioc-devel


This email message may contain legally privileged and/or...{{dropped:2}}

_______________________________________________
Bioc-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/bioc-devel

Reply via email to