I have the following nested loop:
for (x in xs) {
for (y in ys) {
# Do something with x and y
}
}
Which I’d like to flatten
R has a different paradigm than Python, so don't expect it to have generators or tuples -- we have vectors and indices for that.
This way, to map a function on a Cartesian product simply call
outer(xs,ys,function(x,y) ...)
and undim the result if you wish.
EDIT: In case xs
or ys
are something more complex than base vectors, one option is to use indices, i.e.
outer(seq(a=xs),seq(a=ys),function(xi,yi) ... xs[[xi]]/ys[xi,]/etc. ...)
or map a function on a bit hand-crafted product using mapply
mapply(function(x,y) ...,xs,rep(ys,each=length(xs)))
You can use the apply
function to apply a function to each row of your data frame. Just replace "your function"
with your actual function.
# example data
xs <- rnorm(10)
ys <- rnorm(10)
apply(expand.grid(xs, ys), 1, FUN = function(x) {"your function"})
This is a very basic example. Here, the sum of both values in a row is calculated:
apply(expand.grid(xs, ys), 1, FUN = function(x) {x[1] + x[2]})
Here is a variant that uses named arguments (xs
, ys
) instead of indices (x[1]
, x[2]
):
myfun <- function(xs, ys) xs + ys
arguments <- expand.grid(xs = rnorm(10), ys = rnorm(10))
apply(arguments, 1, function(x)do.call(myfun, as.list(x)))