blob: 74a1acb27f76b34d294023e1546ae955a650f12a [file] [log] [blame]
% File src/library/base/man/pipeOp.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2022 R Core Team
% Distributed under GPL 2 or later
\name{pipeOp}
\alias{|>}
\alias{pipeOp}
\title{Forward Pipe Operator}
\description{
Pipe a value into a call expression or a function expression.
}
\usage{
\special{lhs |> rhs}
}
\arguments{
\item{lhs}{expression producing a value.}
\item{rhs}{a call expression.}% or an expression of the form \code{symbol => call}
}
\details{
A pipe expression passes, or pipes, the result of the left-hand side
expression \code{lhs} to the right-hand side expression \code{rhs}.
The \code{lhs} is
inserted as the first argument in the call. So \code{x |> f(y)} is
interpreted as \code{f(x, y)}.
To avoid ambiguities, functions in \code{rhs} calls may not be
syntactically special, such as \code{+} or \code{if}.
It is also possible to use a named argument with the placeholder
\code{_} in the \code{rhs} call to specify where the \code{lhs} is to
be inserted. The placeholder can only appear once on the \code{rhs}.
Pipe notation allows a nested sequence of calls to be written in a way
that may make the sequence of processing steps easier to follow.
Currently, pipe operations are implemented as syntax transformations.
So an expression written as \code{x |> f(y)} is parsed as \code{f(x,
y)}. It is worth emphasizing that while the code in a pipeline is
written sequentially, regular R semantics for evaluation apply and
so piped expressions will be evaluated only when first used in the
\code{rhs} expression.
}
\value{
Returns the result of evaluating the transformed expression.
}
\section{Background}{
The forward pipe operator is motivated by the pipe introduced in the
\CRANpkg{magrittr} package, but is more streamlined. It is similar to
the pipe or pipeline operators introduced in other languages, including
F#, Julia, and JavaScript.
}
\examples{
# simple uses:
mtcars |> head() # same as head(mtcars)
mtcars |> head(2) # same as head(mtcars, 2)
mtcars |> subset(cyl == 4) |> nrow() # same as nrow(subset(mtcars, cyl == 4))
# to pass the lhs into an argument other than the first, either
# use the _ placeholder with a named argument:
mtcars |> subset(cyl == 4) |> lm(mpg ~ disp, data = _)
# or use an anonymous function:
mtcars |> subset(cyl == 4) |> (function(d) lm(mpg ~ disp, data = d))()
mtcars |> subset(cyl == 4) |> (\(d) lm(mpg ~ disp, data = d))()
# or explicitly name the argument(s) before the "one":
mtcars |> subset(cyl == 4) |> lm(formula = mpg ~ disp)
# the pipe operator is implemented as a syntax transformation:
quote(mtcars |> subset(cyl == 4) |> nrow())
# regular R evaluation semantics apply
stop() |> (function(...) {})() # stop() is not used on RHS so is not evaluated
}
\keyword{programming}
\keyword{data}