wrapr
includes de-referencing, function evaluation, and
a new concept called "wrapr_applicable"
.
"wrapr_applicable"
is dispatch by type of right hand side
argument scheme.
wrapr
The wrapr
pipe operators (%.>%
and
%>.%
) are roughly defined as:
a %>.% b ~ { . <- a; b };
. This works under the
assumption that b
is an expression with free-instances of
“.
”. A typical use is:
The above is performed by standard S3
dispatch on the
left argument of an exported generic functions called
apply_left()
and apply_right()
. A formal
description of wrapr
piping can be found here.
wrapr
works primarily over expressions and
“.
”. wrapr
does tries to de-reference names
found in the right-hand side of pipe stages, and also dispatches
functions. One can also write the following.
"wrapr_applicable"
Arbitrary objects ask wrapr
to treat them as special
expressions by overriding one or more of apply_left()
and
apply_right()
for the S3
class they wish
managed.
For example:
function_reference <- list(f = sin)
class(function_reference) <- c("wrapr_applicable", "ourclass")
apply_right.ourclass <- function(pipe_left_arg,
pipe_right_arg,
pipe_environment,
left_arg_name,
pipe_string,
right_arg_name) {
pipe_right_arg$f(pipe_left_arg)
}
function_reference
#> $f
#> function (x) .Primitive("sin")
#>
#> attr(,"class")
#> [1] "wrapr_applicable" "ourclass"
5 %.>% function_reference
#> [1] -0.9589243
function_reference$f <- sqrt
5 %.>% function_reference
#> [1] 2.236068
The signature arguments work as follows:
pipe_left_arg
: The value moving down the pipeline.pipe_right_arg
: The right pipeline operator
(essentially “self
” or “this
” in object
oriented terms, used for S3
dispatch).pipe_environment
: The environment the pipeline is
working in (not usually needed).left_arg_name
: If the left arguement was passed in by
name, what that name was.pipe_string
: The name of the pipe operator (not usually
needed).right_arg_name
: If the right arguement was passed in by
name, what that name was.This functionality allows arbitrary objects to directly specify their intended pipeline behavior.
Let’s use a debugging function to see the values of all of the arguments.
apply_right.ourclass <- function(pipe_left_arg,
pipe_right_arg,
pipe_environment,
left_arg_name,
pipe_string,
right_arg_name) {
print("pipe_left_arg")
print(pipe_left_arg)
print("pipe_right_arg")
print(pipe_right_arg)
print("pipe_environment")
print(pipe_environment)
print("left_arg_name")
print(left_arg_name)
print("pipe_string")
print(pipe_string)
print("right_arg_name")
print(right_arg_name)
pipe_right_arg$f(pipe_left_arg)
}
5 %.>% function_reference
#> [1] "pipe_left_arg"
#> [1] 5
#> [1] "pipe_right_arg"
#> $f
#> function (x) .Primitive("sqrt")
#>
#> attr(,"class")
#> [1] "wrapr_applicable" "ourclass"
#> [1] "pipe_environment"
#> <environment: R_GlobalEnv>
#> [1] "left_arg_name"
#> NULL
#> [1] "pipe_string"
#> [1] "%.>%"
#> [1] "right_arg_name"
#> function_reference
#> [1] 2.236068
a <- 5
a %.>% function_reference
#> [1] "pipe_left_arg"
#> [1] 5
#> [1] "pipe_right_arg"
#> $f
#> function (x) .Primitive("sqrt")
#>
#> attr(,"class")
#> [1] "wrapr_applicable" "ourclass"
#> [1] "pipe_environment"
#> <environment: R_GlobalEnv>
#> [1] "left_arg_name"
#> a
#> [1] "pipe_string"
#> [1] "%.>%"
#> [1] "right_arg_name"
#> function_reference
#> [1] 2.236068
wrapr
values (left-hand sides of pipe expressions) are
completely general. wrapr
operators (right-hand sides of
pipe expressions) are primarily intended to be expressions that have
“.
” as a free-reference. wrapr
can also be
used with right-hand sides that are function references or with
arbitrary annotated objects.