[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