Menu Home

Some Fun With User/Package Level Pipes/Anonymous-Functions

In addition to adding a base-R pipe it appears a new base-R function builders is in the works (in addition to “function”).

R is a very versatile language, with a great ability to accept user-level or package extensions. What I mean by this is, user code and package code (which have about the same level of privilege) can control quite a lot. A pretty graceful pipe and function builder can in fact already be written in R itself.

For brevity I’ll demonstrate this using package code (so we don’t have to see all the details).

Let’s try and build a new anonymous function builder other than function.

library(wrapr)  # attach the wrapr package
defineLambda()  # add λ function builder to workspace

f <- λ(x, x + 1)  # define a function that adds one
f(2)  # use it
# [1] 3

Now we can pipe into such a function.

3 %.>% f
# [1] 4

And we can pipe directly into the anonymous function definition if we add the argument placeholder.

4 %.>% λ(x, x + 1)(.)
[1] 5

At first it appears we can’t pipe into the definition without the placeholder.

5 %.>% λ(x, x + 1)
# function (x) 
# x + 1

However, can solve this with bquote-style argument escaping.

6 %.>% .(λ(x, x + 1))
# [1] 7

Or even by setting an attribute on the function builder.

attr(λ, 'dotpipe_eager_eval_function') <- TRUE

7 %.>% λ(x, x + 1)
# [1] 8

This controlled effect is due the wrapr-dot-pipe treating the incoming argument as a value and using R’s existing S3 and S4 type systems to control pipe behavior. This is the power of leaving control in the hands of the users and packages, we can specify what behavior we expect from the function builder to our taste.

Categories: Opinion Tutorials

Tagged as:


Data Scientist and trainer at Win Vector LLC. One of the authors of Practical Data Science with R.

%d bloggers like this: