[Rd] side-effect of calling functions via `::`

Martin Maechler maechler at stat.math.ethz.ch
Fri Sep 1 13:55:23 CEST 2017


>>>>> Simon Barthelmé <simon.barthelme at gipsa-lab.fr>
>>>>>     on Fri, 1 Sep 2017 12:57:13 +0200 writes:

    > Dear list
    > I'm not sure whether this is a bug or an unavoidable consequence of the 
    > way packages are loaded, but there can be surprising side effects of 
    > calling a function via package::function. Here's an example using the 
    > formula.tools package:

    > form <- a ~ b
    > as.character(form)
    > formula.tools::lhs(form)
    > as.character(form)

    > The first call to as.character returns:
    > [1] "~" "a" "b"
    > The second returns:
    > [1] "a ~ b"

    > The reason being that formula.tools has:
    > S3method(as.character,formula)
    > in its namespace, which quietly supersedes the default one. 

Sure. 

    > In my case it led to a bug that was rather hard to track
    > down because it looked like non-deterministic behaviour.

well, it shouldn't have been hard to track I think ... see below

    > Shouldn't there at least be a warning about such side effects, the way 
    > library() tells you about masking?

The help page on  "::"  is pretty clear about the fact that the
namespace is loaded if necessary.

Personally I've got the impression that  <namespace>::<name>  is
much "overused" nowadays, notably in packages where I'd strongly
advocate using  importFrom() in NAMESPACE, so all this happens
at package load time, and then _not_ using `::` in the package
sources itself.

Many people seem to forget that every use of `::` is an R
function call and using it is ineffecient compared to just using
the already imported name.

Best,
Martin Maechler
ETH Zurich and R Core Team

    > Best
    > Simon Barthelme



More information about the R-devel mailing list