Really, we have three levels of behavior related to dispatch: not loaded, 
loaded and attached. The loaded state is the most fragile - it does change some 
behavior (like the one below) but not others (when the package defines a new 
version of a generic). So it is true that the dispatch is the most problematic, 
in some sense you'd want it to be local to the package code when the package is 
not attached, but that's not supported in R as it is now.

Martin, re :: - I strongly disagree, semantically I find :: much cleaner than 
imports because you know exactly which function you call at all times and you 
don't pollute you package unnecessarily. It is unfortunate that the construct 
is inefficient in R, but that's an implementation problem, it shouldn't be 
because in fact it's immediately clear which symbol is meant. I believe the 
compiler should be able to fix that so in principle it shouldn't make a 
difference performance wise.

Cheers,
Simon


> On Sep 1, 2017, at 8:03 AM, Martin Maechler <maech...@stat.math.ethz.ch> 
> wrote:
> 
>>>>>> Lionel Henry <lio...@rstudio.com>
>>>>>>    on Fri, 1 Sep 2017 13:47:07 +0200 writes:
> 
>> A package should probably never register a S3 method unless it owns
>> either the generic or the class.
> 
> I agree... (and typically it does "own" the class)
> 
>> Here `formula.tools` owns neither.
> 
> i.e., it neither defines as.character() nor class "formula".
> 
>> Instead of registering the method, it should export it like a regular
>> function. This way S3 dispatch is based on lexical scoping rather than
>> session-wide side effect.
> 
> I don't the 2nd sentence above is quite correct.  S3 method
> registration should be done (in the case it should) and S3
> dispatch is not just based on lexical scoping but also on S3
> method registration.
> 
>> Lionel
> 
> It is still the case that :: silently loads the namespace if
> needed, and that "things may behave differently" after the use '::', because
> loading a namespace does have an effect on the R session ...,
> (and I still think  `::`  is much  "over used")
> 
> Martin
> 
> 
> 
>>> On 1 sept. 2017, at 12:57, Simon Barthelmé <simon.barthe...@gipsa-lab.fr> 
>>> wrote:
>>> 
>>> 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. In my case it 
>>> led to a bug that was rather hard to track down because it looked like 
>>> non-deterministic behaviour.
>>> Shouldn't there at least be a warning about such side effects, the way 
>>> library() tells you about masking?
>>> 
>>> Best
>>> 
>>> Simon Barthelme
>>> 
>>> ______________________________________________
>>> R-devel@r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
>> ______________________________________________
>> R-devel@r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> ______________________________________________
> R-devel@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to