convoke unifies functions along a single specification using
statements on function argument transformations that would be needed. The
result is a single function whose interface can be changed simply by
changing the respective argument in the generated function.
Arguments
- argslist
[
list] The desired unifying arguments. A list call.- ...
[
function] All the various specifications for function argument transformations.
Value
Function with additional class convoke with arguments being
convoke_func(specified_args, interface, ..., evaluate = TRUE)evaluate argument is useful for debugging purposes. Extra arguments can
be passed in the format interface.arg.
Unifying Functions
Specifying the unifying interface
The unifying interface needs to be specified as arglist for the new function
list(arg1 = default1, arg2 = default2, etc.)Composing functions
It is also possible to progressively add functions to a convoke function simply by adding to the convoke function the new specifications:
convoke_func + ~func_specSee also
Other function assemblers:
conflate()
Examples
# unifying functions with swapped arguments
foo <- function(a1, b1) {
a1 / b1
}
bar <- function(b2, a2) {
a2 / b2
}
convoked <- convoke(
list(a, b),
foo(a1 = a, b1 = b),
bar(b2 = b, a2 = a)
)
c(convoked(9, 5), bar(5, 9))
#> [1] 1.8 1.8
c(convoked(9, 5, interface = "bar"), foo(9, 5))
#> [1] 1.8 1.8
# supplying optional arguments
foo <- function(a1, b1, round = FALSE) {
if (round) round(a1 / b1) else a1 / b1
}
bar <- function(b2, a2) {
a2 / b2
}
convoked <- convoke(
list(a, b),
foo(a1 = a, b1 = b),
bar(b2 = b, a2 = a)
)
c(convoked(9, 5, foo.round = FALSE), bar(5, 9))
#> [1] 1.8 1.8
c(convoked(9, 5, foo.round = TRUE), round(bar(5, 9)))
#> [1] 2 2
# TODO fix and show this for three sequences
# adding further functions later
foo <- function(a1, b1) {
a1 / b1
}
bar <- function(b2, a2) {
a2 / b2
}
(convoked <- convoke(list(a, b), foo(a1 = a, b1 = b)))
#> convoke function
#> interfaces: foo()
#> args: a, b, interface = foo, interface.args
(convoked <- convoked + ~ bar(b2 = b, a2 = a))
#> convoke function
#> interfaces: foo(), bar()
#> args: a, b, interface = foo, interface.args
c(convoked(9, 5, interface = "bar"), foo(5, 9))
#> [1] 1.8000000 0.5555556