[Rd] [External] Re: New pipe operator
Gabor Grothendieck
ggrothend|eck @end|ng |rom gm@||@com
Sun Dec 6 18:32:31 CET 2020
The following gives an error.
1 |> `+`(2)
## Error: function '+' is not supported in RHS call of a pipe
1 |> `+`()
## Error: function '+' is not supported in RHS call of a pipe
but this does work:
1 |> (`+`)(2)
## [1] 3
1 |> (`+`)()
## [1] 1
The error message suggests that this was intentional.
It isn't mentioned in ?"|>"
On Sat, Dec 5, 2020 at 1:19 PM <luke-tierney using uiowa.edu> wrote:
>
> We went back and forth on this several times. The key advantage of
> requiring parentheses is to keep things simple and consistent. Let's
> get some experience with that. If experience shows requiring
> parentheses creates too many issues then we can add the option of
> dropping them later (with special handling of :: and :::). It's easier
> to add flexibility and complexity than to restrict it after the fact.
>
> Best,
>
> luke
>
> On Sat, 5 Dec 2020, Hugh Parsonage wrote:
>
> > I'm surprised by the aversion to
> >
> > mtcars |> nrow
> >
> > over
> >
> > mtcars |> nrow()
> >
> > and I think the decision to disallow the former should be
> > reconsidered. The pipe operator is only going to be used when the rhs
> > is a function, so there is no ambiguity with omitting the parentheses.
> > If it's disallowed, it becomes inconsistent with other treatments like
> > sapply(mtcars, typeof) where sapply(mtcars, typeof()) would just be
> > noise. I'm not sure why this decision was taken
> >
> > If the only issue is with the double (and triple) colon operator, then
> > ideally `mtcars |> base::head` should resolve to `base::head(mtcars)`
> > -- in other words, demote the precedence of |>
> >
> > Obviously (looking at the R-Syntax branch) this decision was
> > considered, put into place, then dropped, but I can't see why
> > precisely.
> >
> > Best,
> >
> >
> > Hugh.
> >
> >
> >
> >
> >
> >
> >
> > On Sat, 5 Dec 2020 at 04:07, Deepayan Sarkar <deepayan.sarkar using gmail.com> wrote:
> >>
> >> On Fri, Dec 4, 2020 at 7:35 PM Duncan Murdoch <murdoch.duncan using gmail.com> wrote:
> >>>
> >>> On 04/12/2020 8:13 a.m., Hiroaki Yutani wrote:
> >>>>> Error: function '::' not supported in RHS call of a pipe
> >>>>
> >>>> To me, this error looks much more friendly than magrittr's error.
> >>>> Some of them got too used to specify functions without (). This
> >>>> is OK until they use `::`, but when they need to use it, it takes
> >>>> hours to figure out why
> >>>>
> >>>> mtcars %>% base::head
> >>>> #> Error in .::base : unused argument (head)
> >>>>
> >>>> won't work but
> >>>>
> >>>> mtcars %>% head
> >>>>
> >>>> works. I think this is a too harsh lesson for ordinary R users to
> >>>> learn `::` is a function. I've been wanting for magrittr to drop the
> >>>> support for a function name without () to avoid this confusion,
> >>>> so I would very much welcome the new pipe operator's behavior.
> >>>> Thank you all the developers who implemented this!
> >>>
> >>> I agree, it's an improvement on the corresponding magrittr error.
> >>>
> >>> I think the semantics of not evaluating the RHS, but treating the pipe
> >>> as purely syntactical is a good decision.
> >>>
> >>> I'm not sure I like the recommended way to pipe into a particular argument:
> >>>
> >>> mtcars |> subset(cyl == 4) |> \(d) lm(mpg ~ disp, data = d)
> >>>
> >>> or
> >>>
> >>> mtcars |> subset(cyl == 4) |> function(d) lm(mpg ~ disp, data = d)
> >>>
> >>> both of which are equivalent to
> >>>
> >>> mtcars |> subset(cyl == 4) |> (function(d) lm(mpg ~ disp, data = d))()
> >>>
> >>> It's tempting to suggest it should allow something like
> >>>
> >>> mtcars |> subset(cyl == 4) |> lm(mpg ~ disp, data = .)
> >>
> >> Which is really not that far off from
> >>
> >> mtcars |> subset(cyl == 4) |> \(.) lm(mpg ~ disp, data = .)
> >>
> >> once you get used to it.
> >>
> >> One consequence of the implementation is that it's not clear how
> >> multiple occurrences of the placeholder would be interpreted. With
> >> magrittr,
> >>
> >> sort(runif(10)) %>% ecdf(.)(.)
> >> ## [1] 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> >>
> >> This is probably what you would expect, if you expect it to work at all, and not
> >>
> >> ecdf(sort(runif(10)))(sort(runif(10)))
> >>
> >> There would be no such ambiguity with anonymous functions
> >>
> >> sort(runif(10)) |> \(.) ecdf(.)(.)
> >>
> >> -Deepayan
> >>
> >>> which would be expanded to something equivalent to the other versions:
> >>> but that makes it quite a bit more complicated. (Maybe _ or \. should
> >>> be used instead of ., since those are not legal variable names.)
> >>>
> >>> I don't think there should be an attempt to copy magrittr's special
> >>> casing of how . is used in determining whether to also include the
> >>> previous value as first argument.
> >>>
> >>> Duncan Murdoch
> >>>
> >>>
> >>>>
> >>>> Best,
> >>>> Hiroaki Yutani
> >>>>
> >>>> 2020年12月4日(金) 20:51 Duncan Murdoch <murdoch.duncan using gmail.com>:
> >>>>>
> >>>>> Just saw this on the R-devel news:
> >>>>>
> >>>>>
> >>>>> R now provides a simple native pipe syntax ‘|>’ as well as a shorthand
> >>>>> notation for creating functions, e.g. ‘\(x) x + 1’ is parsed as
> >>>>> ‘function(x) x + 1’. The pipe implementation as a syntax transformation
> >>>>> was motivated by suggestions from Jim Hester and Lionel Henry. These
> >>>>> features are experimental and may change prior to release.
> >>>>>
> >>>>>
> >>>>> This is a good addition; by using "|>" instead of "%>%" there should be
> >>>>> a chance to get operator precedence right. That said, the ?Syntax help
> >>>>> topic hasn't been updated, so I'm not sure where it fits in.
> >>>>>
> >>>>> There are some choices that take a little getting used to:
> >>>>>
> >>>>> > mtcars |> head
> >>>>> Error: The pipe operator requires a function call or an anonymous
> >>>>> function expression as RHS
> >>>>>
> >>>>> (I need to say mtcars |> head() instead.) This sometimes leads to error
> >>>>> messages that are somewhat confusing:
> >>>>>
> >>>>> > mtcars |> magrittr::debug_pipe |> head
> >>>>> Error: function '::' not supported in RHS call of a pipe
> >>>>>
> >>>>> but
> >>>>>
> >>>>> mtcars |> magrittr::debug_pipe() |> head()
> >>>>>
> >>>>> works.
> >>>>>
> >>>>> Overall, I think this is a great addition, though it's going to be
> >>>>> disruptive for a while.
> >>>>>
> >>>>> Duncan Murdoch
> >>>>>
> >>>>> ______________________________________________
> >>>>> R-devel using r-project.org mailing list
> >>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
> >>>>
> >>>> ______________________________________________
> >>>> R-devel using r-project.org mailing list
> >>>> https://stat.ethz.ch/mailman/listinfo/r-devel
> >>>>
> >>>
> >>> ______________________________________________
> >>> R-devel using r-project.org mailing list
> >>> https://stat.ethz.ch/mailman/listinfo/r-devel
> >>
> >> ______________________________________________
> >> R-devel using r-project.org mailing list
> >> https://stat.ethz.ch/mailman/listinfo/r-devel
> >
> > ______________________________________________
> > R-devel using r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
> >
>
> --
> Luke Tierney
> Ralph E. Wareham Professor of Mathematical Sciences
> University of Iowa Phone: 319-335-3386
> Department of Statistics and Fax: 319-335-3017
> Actuarial Science
> 241 Schaeffer Hall email: luke-tierney using uiowa.edu
> Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
--
Statistics & Software Consulting
GKX Group, GKX Associates Inc.
tel: 1-877-GKX-GROUP
email: ggrothendieck at gmail.com
More information about the R-devel
mailing list