Как определить рекурсив для l oop в R? - PullRequest
0 голосов
/ 25 января 2020

У меня есть ранее неизвестное количество переменных, и для каждой переменной мне нужно определить a для l oop и выполнить ряд операций. Для каждой последующей переменной мне нужно определить вложенную l oop внутри предыдущей, выполняя те же операции. Я предполагаю, что должен быть способ сделать это рекурсивно, но я борюсь с этим.

Рассмотрим, например, следующий простой пример:

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

    }
  }
}

В этом примере у меня будет 3 переменные. Для l oop на j требуется информация от l oop i, а для l oop на k требуется информация от l oop j. Это упрощенный пример моей проблемы, и операции здесь довольно просты. Я не заинтересован в другом способе получения вектора «результатов», что я хотел бы знать, есть ли способ рекурсивно выполнять эти операции для неизвестного числа переменных, скажем, 10 переменных, так что мне не нужно вкладывать вручную 10 петель.

Ответы [ 2 ]

1 голос
/ 25 января 2020

Вот один из подходов, который вы можете изменить для своей ситуации ...

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
                     )
               ) 
}

Две проблемы с этим:

a), что ваша формула отличается в первый (внешний) l oop и

b) порядок результатов отличается от вашего

Однако вы можете найти обходные пути для них в зависимости от вашей реальной проблемы.

0 голосов
/ 25 января 2020

Я попытался изменить код так, чтобы это была функция, которая позволяет определить, сколько итераций должно произойти.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...