Fwd: Document colon equals `:=` operator ?

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Fwd: Document colon equals `:=` operator ?

Ant F
Dear all,

There was some discussion lately on twitter (
https://twitter.com/geospacedman/status/1164208293377691648 ) about the
status of the colon equal operator. I'm sure it has been discussed in the
past but I couldn't find anything, I'll start by clarifying all i can by
myself to have strong reference, and then ask a few questions at the bottom.

`:=` has been used by data table for a very long time and more recently by
tidyverse packages through rlang package, in both cases to parse
expressions (it's also defined and exported by data.table but just to
trigger an error). It was used in ggvis too, and I have myself designed the
package dotdot that defines it. I'm note aware of other uses in packages
though it pops up from time to time in Stack Overflow 's Q&A.

It has the same precedence as `<-`.

It is used by data.table and tidyverse to provide key / value pairs to
function arguments where `=` would trigger a failure.

It can also convenient at the top level because the rhs is NOT
evaluated/copied before entering the function, as it is with `=` and `<-`.

My understanding based on :

* John Chambers 2001 : https://developer.r-project.org/equalAssign.html
* Matt Dowle 2011 :
https://stackoverflow.com/questions/7033106/why-has-data-table-defined-rather-than-overloading

is that `:=` used to be an equivalent to `<-`, along with `_`. At some
point the decision was made to remove `_` and `:=`. BUT, and as I
understand it started as a mistake,  the `:=` operator was kept (without
definition).

Then Matt Dowle used it in data.table, which gained tremendous popularity,
and thus it was kept around, and later implemented by Hadley Wickham and
Lionel Henry in rlang as a central component of tidy evaluation.

?data.table::`:=` and ?rlang::`:=` describe how to use the operator in the
context of the package but don't refer to its undocumented status.

Some relevant chunks of source code :

*
https://github.com/wch/r-source/blob/tags/R-3-6-1/src/main/gram.y#L379-L381
*
https://github.com/wch/r-source/blob/tags/R-3-6-1/src/main/gram.y#L2999-L3002

Now for the questions :

Some R users worry that the use of `:=` is not safe, as it is
undocumented.  It would be good to be able for package authors to reassure
their users that the package won't break because R Core decides to remove
the operator at some point, or change its behavior.

* Could we have an official statement that the `:=` operator is NOT going
to be removed and can be used safely in packages ? OR could we have an
official statement that the use of the `:=` is discouraged and unsafe given
it might be removed at some point

* If we can have confirmation that the operator won't be removed (and thus
can be used for parsing), could we also have an official statement that it
will also remain possible to define it ? (which data.table and tidyverse
don't require for instance, but dotdot does) OR have a statement that
assuming this is not safe.

* Could we have these statements reflected in the doc ? Or why can't we ? I
believe that even if R Core discourages the use of `:=`, this should be
reflected in the doc. Users encountering it should still be able to
understand what's going on through the base documentation. Referencing it
in `?Syntax` along with a short note would go a long way.

Many thanks and apologies for the possible redundancy with previous threads,

Antoine

        [[alternative HTML version deleted]]

______________________________________________
[hidden email] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel