These are documented but still seem like serious deficiencies: > f <- function(x, y) x + 10*y > 3 |> x => f(x, x) Error in f(x, x) : pipe placeholder may only appear once
> 3 |> x => f(1+x, 1) Error in f(1 + x, 1) : pipe placeholder must only appear as a top-level argument in the RHS call Also note: ?"=>" No documentation for ‘=>’ in specified packages and libraries: you could try ‘??=>’ On Tue, Dec 22, 2020 at 5:28 PM <luke-tier...@uiowa.edu> wrote: > > It turns out that allowing a bare function expression on the > right-hand side (RHS) of a pipe creates opportunities for confusion > and mistakes that are too risky. So we will be dropping support for > this from the pipe operator. > > The case of a RHS call that wants to receive the LHS result in an > argument other than the first can be handled with just implicit first > argument passing along the lines of > > mtcars |> subset(cyl == 4) |> (\(d) lm(mpg ~ disp, data = d))() > > It was hoped that allowing a bare function expression would make this > more convenient, but it has issues as outlined below. We are exploring > some alternatives, and will hopefully settle on one soon after the > holidays. > > The basic problem, pointed out in a comment on Twitter, is that in > expressions of the form > > 1 |> \(x) x + 1 -> y > 1 |> \(x) x + 1 |> \(y) x + y > > everything after the \(x) is parsed as part of the body of the > function. So these are parsed along the lines of > > 1 |> \(x) { x + 1 -> y } > 1 |> \(x) { x + 1 |> \(y) x + y } > > In the first case the result is assigned to a (useless) local > variable. Someone writing this is more likely to have intended to > assign the result to a global variable, as this would: > > (1 |> \(x) x + 1) -> y > > In the second case the 'x' in 'x + y' refers to the local variable 'x' > in the first RHS function. Someone writing this is more likely to have > meant > > (1 |> \(x) x + 1) |> \(y) x + y > > with 'x' in 'x + y' now referring to a global variable: > > > x <- 2 > > 1 |> \(x) x + 1 |> \(y) x + y > [1] 3 > > (1 |> \(x) x + 1) |> \(y) x + y > [1] 4 > > These issues arise with any approach in R that allows a bare function > expression on the RHS of a pipe operation. It also arises in other > languages with pipe operators. For example, here is the last example > in Julia: > > julia> x = 2 > 2 > julia> 1 |> x -> x + 1 |> y -> x + y > 3 > julia> ( 1 |> x -> x + 1 ) |> y -> x + y > 4 > > Even though proper use of parentheses can work around these issues, > the likelihood of making mistakes that are hard to track down is too > high. So we will disallow the use of bare function expressions on the > right hand side of a pipe. > > Best, > > luke > > -- > 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-tier...@uiowa.edu > Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu > > ______________________________________________ > R-devel@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 ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel