Создание списка, содержащего каждый шаг цикла while - PullRequest
1 голос
/ 15 октября 2019

Я запускаю цикл while, который выполняет некоторые модели прогнозирования. Моя проблема заключается в том, что использование цикла while перезаписывает модель на каждом шаге, оставляя только результаты последней итерации. Но я хочу сохранить модели каждого шага в списке.

Вот простой пример.

i <- 0
while(i < 5) {
 i <- i + 1
 my_model <- i
}

Здесь my_model содержит только i последнего шага:

my_model
5

Как создать список, содержащий объекты my_model каждого шага? Итак, мой ожидаемый результат:

my_model_list <- list(1, 2, 3, 4, 5)

Мне нужно добиться этого ожидаемого результата с помощью петли while, как показано выше. Все, что я до сих пор придумал, - это использование assign для создания объектов на каждом шаге. Но я надеюсь, что есть лучшее решение.

Ответы [ 4 ]

1 голос
/ 15 октября 2019

Это не самый простой способ сделать что-либо в этом случае с использованием семейства apply, например:

my_model <- lapply(0:5,function(i){i})

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

Редактировать: выполняет ли это работу

fun.list <- function(my.i){
  my_model <- lapply(0:my.i,function(i){i})
  return(my_model)
}


i <- 0 
repeat{
  my_model <- fun.list(my.i=i)
  if (i > 4) break
  i <- i + 1
}

Результирующий список выглядит следующим образом

>my_model
[[1]]
[1] 0

[[2]]
[1] 1

[[3]]
[1] 2

[[4]]
[1] 3

[[5]]
[1] 4

[[6]]
[1] 5
1 голос
/ 15 октября 2019

Комментарий @jay.sf помог мне найти функцию list.append из пакета rlist, которая работает, как и ожидалось.

Для примера моего вопроса:

i <- 0
my_model <- list()
while(i < 5) {
  i <- i + 1
  my_model <- list.append(my_model, i) 
}

Или обратиться к хорошему примеру Чжицяна Вана:

i <- 0
my_model <- list()
while(i < 5) {
  i <- i + 1
  my_model <- list.append(my_model, lm(mpg ~ cyl, data = mtcars))
}

РЕДАКТИРОВАТЬ

Оба ответа очень многообещающие, но они не работают для меня, потому что на каждом шаге цикла while кадр данных являетсясоздан и, очевидно, этот подход не работает для фреймов данных. Смотрите здесь:

my_model <- list()
my_model[1] <- data.frame(matrix(rnorm(10*10), ncol= 10))
str(my_model)
List of 1
 $ : num [1:10] -1.023 -0.548 -0.534 -1.444 2.471 ...

К счастью, list.append работает здесь также, как и ожидалось:

i <- 0
my_model <- list(NA)
while(i < 5) {
  i <- i + 1
  my_model <- list.append(my_model, data.frame(matrix(rnorm(10*10), ncol= 10)))
}
0 голосов
/ 15 октября 2019

Как насчет этого:

my_model <- list()
i <- 0
while(i < 5) {
  i <- i + 1
  my_model[i] <- lm(mpg ~ cyl, data = mtcars)
}
0 голосов
/ 15 октября 2019

Инициализируйте пустой список, затем поместите в него все выходные данные.

my_model = list()
i <- 0
while(i < 5) {
  i <- i + 1
  my_model[i] <- i
}

, что дает:

> my_model
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

[[4]]
[1] 4

[[5]]
[1] 5
...