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

Lexically scoped methods work well (e.g. all methods in the base package)
but they are discouraged by a WARNING in R CMD check:

```
Found the following apparent S3 methods exported but not registered:
  as.character.formula
See section ‘Registering S3 methods’ in the ‘Writing R Extensions’
manual.
```

I think that's too bad because they seem like a legitimate way of
providing encapsulated dispatch.

Lionel


> On 1 sept. 2017, at 14:49, Simon Urbanek <simon.urba...@r-project.org> wrote:
> 
> 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