I have a list of functions
functions <- list(f1, f2, f3, ...)
And I need to pass an object x
through all the functions. I could do it by:
for (fun in functions){
fun(x)
}
The functions do not return anything, but their order is important, i.e. f1(x)
must be applied before f2(x)
.
Thus, I'm thinking on using lapply
:
lapply(functions, function(fun) fun(x))
But I don't know if lapply
applies first the first function of the list functions
or if it follows another order. With the loop I assure the ordering but it may go slower.
Any idea?
The wording of the question "pass x through ..." suggests that you think this will accomplish a "composition", i.e. a serial application of functions to results from prior applications. Neither of your proposed solutions will do that although you could rework your for
loop to do so. Take a look at the ?funprog
help page which I am shamelessly quoting in part:
## Iterative function application:
Funcall <- function(f, ...) f(...)
## Compute log(exp(acos(cos(0))
Reduce(Funcall, list(log, exp, acos, cos), 0, right = TRUE)
Compare the results of a for
loop version with the Reduce
version:
> flist <- list(log, exp, acos, cos)
> arg <- 0; for (f in flist) {arg <- f(arg)}
> arg
[1] 6.123234e-17
> Funcall <- function(f, ...) f(...)
> ## Compute log(exp(acos(cos(0))
> Reduce(Funcall, list(log, exp, acos, cos), 0, right = TRUE)
[1] 0
This shows that <something>
is actually happening:
arg <- 0; for (f in flist) {arg <- f(arg);cat(arg,"\n")}
-Inf
0
1.570796
6.123234e-17
But they are not the same since the right=TRUE
actually reverses the order of application and explains the trivial difference in the final result. Compare:
arg <- 0; for (f in rev(flist)) {arg <- f(arg);cat(arg,"\n")}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With