The
wrapr dot arrow pipe
was designed to both be an effective R
function application pipe and also an experimental test-bed for pipe
effects.
Let’s take a look at implementing a new effect from a user perspective.
The idea we want to implement is delayed evaluation through a collecting
object we call a “locum” or stand-in. The locum is intended to collect
operations without executing them, for later use. This is similar to a
lambda or function abstraction. The code is now in the wrapr
package, but
could be implemented by any user as it uses only public or semi-public
wrapr interfaces.
The locum was for a while a part of wrapr, but now it is user code
in the file locum.R.
Let’s start loading the wrapr package.
library(wrapr)
source("locum.R")
We can use the locum to collect the operations, and then print them.
y <- 4
p <- locum() %.>%
sin(.) %.>%
cos(.) %.>%
atan2(., y)
print(p)
## locum() %.>%
## sin(.) %.>%
## cos(.) %.>%
## atan2(., y)
We can now replace the locum with the value we want to apply the
pipeline to.
5 %.>% p
## [1] 0.1426252
This yields the same answer as the following function application.
atan2(cos(sin(5)), 4)
## [1] 0.1426252
We can also add later intended arguments to the pipeline formatting.
print(p, 'start' = 4)
## 4 %.>%
## sin(.) %.>%
## cos(.) %.>%
## atan2(., y)
We can do some fun things, such as combining locum pipelines.
p1 <- locum() %.>% sin(.)
p2 <- locum() %.>% cos(.)
p12 <- p1 %.>% p2
p12
## locum() %.>%
## sin(.) %.>%
## cos(.)
4 %.>% p12
## [1] 0.7270351
cos(sin(4))
## [1] 0.7270351
The idea is: wrapr dot arrow pipe is designed for expansion through
the apply_right, apply_left S3 interfaces, and the
apply_right_S4 S4 interface. And users can access the implementation
through the pipe_impl function. This
example
and the formal
article
should give users a good place to start.
rquery,
rqdatatable, and
cdata already use the extension
interfaces to implement interesting features.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.