From lionel at rstudio.com  Fri Sep  1 13:47:07 2017
From: lionel at rstudio.com (Lionel Henry)
Date: Fri, 1 Sep 2017 13:47:07 +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: <986041A4-19BE-4500-AD7E-4B2A32504D76@rstudio.com>

A package should probably never register a S3 method unless it owns
either the generic or the class. Here `formula.tools` owns neither.
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.

Lionel

> On 1 sept. 2017, at 12:57, Simon Barthelm? <simon.barthelme at 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 at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



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