From maechler at stat.math.ethz.ch  Fri Sep  1 13:55:23 2017
From: maechler at stat.math.ethz.ch (Martin Maechler)
Date: Fri, 1 Sep 2017 13:55:23 +0200
Subject: [Rd] side-effect of calling functions via `::`
In-Reply-To: <59A93D09.8010006@gipsa-lab.fr>
References: <59A93D09.8010006@gipsa-lab.fr>
Message-ID: <22953.19115.608794.137332@stat.math.ethz.ch>

>>>>> 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



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