How to define a recursive for loop in R?

I have a priorly unknown number of variables, and for each variable I need to define a for loop and perform a series of operations. For each subsequent variable, I need to define a nested loop inside the previous one, performing the same operations. I guess there must be a way of doing this recursively, but I am struggling with it.

Consider for instance the following easy example:

results = c()
index = 0

for(i in 1:5)
{
  a = i*2
  for(j in 1:5)
  {
    b = a*2 + j
    for(k in 1:5)
    {
      index = index + 1
      c = b*2 + k
      results[index] = c

    }
  }
}

In this example, I would have 3 variables. The loop on j requires information from the loop i, and the loop on k requires information from the loop j. This is a simplified example of my problem and the operations here are pretty simple. I am not interested on another way of getting the "results" vector, what I would like to know is if there is a way to recursevily do this operations for an unknown number of variables, lets say 10 variables, so that I do not need to nest manually 10 loops.

Upvotes: 0

Views: 198

Answers (2)

Andrew Gustar
Andrew Gustar

Reputation: 18425

Here is one approach that you might be able to modify for your situation...

results <- 0                                     #initialise
for(level in 1:3){                               #3 nested loops - change as required
  results <- c(                                  #converts output to a vector
               outer(results,                    #results so far
                     1:5,                        #as in your loops
                     FUN = function(x,y) {x*2+y} #as in your loops
                     )
               ) 
}

The two problems with this are

a) that your formula is different in the first (outer) loop, and

b) the order of results is different from yours

However, you might be able to find workarounds for these depending on your actual problem.

Upvotes: 1

Jakub.Novotny
Jakub.Novotny

Reputation: 3047

I have tried to change the code so that it is a function that allows to define how many iterations need to happen.

library(tidyverse)


fc <- function(i_end, j_end, k_end){

  i <- 1:i_end
  j <- 1:j_end
  k <- 1:k_end

  df <- crossing(i, j, k) %>%
    mutate(
      a = i*2,
      b = a*2 + j,
      c = b*2 + k,
      index = row_number())

  df

}

fc(5,5,5)

Upvotes: 0

Related Questions