Description Usage Arguments Details Value Examples
A tower is equivalent to the Ruby gem Rack's notion of middleware.
1 |
functions |
list. A list of functions in the tower. The
first argument of each function must be named "object" and
each function must take a |
Imagine a function f1
that, in the middle of its processing,
calls another function, f2
, which in the middle of its
processing, calls another function, f3
, and so on.
To construct such a structure from the list of functions
list(f1, f2, ...)
we need to be able to call the
next "inner" function from the previous outer function.
This is accomplished by providing a yield
keyword
which simply calls the next function in the tower.
The purpose of a tower is to modify some primary object
throughout its operation. To this end, an object
keyword
will be provided to each tower function. If object
is
modified prior to a yield
call, the next function in
the tower will receive the modified object.
For composability, every function in a tower should have a
yield
keyword. The last function in the tower will
yield to an identity function that simply returns the object
.
An S3 "tower" object, which is a callable function
and must be passed the object
as the first argument.
Additional arguments will be passed to the first function
in the tower.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | functions <- list(
function(object, ...) {
object <- object + 1
object <- yield()
object + 1
},
function(object, ...) {
object <- object * 2
yield()
}
)
t <- tower(functions)
v <- t(1) # This is now 5, since in the tower, we increment object,
# Multiply it by 2 in the next function, then increment it
# again after receiving the previous function.
stopifnot(v == 5)
|
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.