Подтвердить что ты не робот

Добавление списка в список списков в R

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

Скажем, я запустил цикл моделирования 3 раза. Во время итераций списки результатов необходимо собирать в один список списков, которые я сохраню как объект R:

Список содержит другие списки и сохраняется: outlist1 <- list()

Первая итерация: resultsa <- list(1,2,3,4,5)

outlist <- append(outlist1,resultsa)

Вторая итерация: resultsb <- list(6,7,8,9,10)

outlist <- append(outlist1,b)

Третья итерация: resultsc <- list(11,12,13,14,15)

outlist <- list(outlist2,c)

Однако это решение не работает с растущим списком, содержащим списки таким образом, желаемый результат:

>outlist
[[1]]
[[1]][[1]]
[1] 1

[[1]][[2]]
[1] 2

[[1]][[3]]
[1] 3

[[1]][[4]]
[1] 4

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


[[2]]
[[2]][[1]]
[1] 6

[[2]][[2]]
[1] 7

[[2]][[3]]
[1] 8

[[2]][[4]]
[1] 9

[[2]][[5]]
[1] 10


[[3]]
[[3]][[1]]
[1] 11

[[3]][[2]]
[1] 12

[[3]][[3]]
[1] 13

[[3]][[4]]
[1] 14

[[3]][[5]]
[1] 15

Однако вместо этого я получаю:

> outlist3
[[1]]
[[1]][[1]]
[[1]][[1]][[1]]
[1] 1

[[1]][[1]][[2]]
[1] 2

[[1]][[1]][[3]]
[1] 3

[[1]][[1]][[4]]
[1] 4

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


[[1]][[2]]
[[1]][[2]][[1]]
[1] 6

[[1]][[2]][[2]]
[1] 7

[[1]][[2]][[3]]
[1] 8

[[1]][[2]][[4]]
[1] 9

[[1]][[2]][[5]]
[1] 10

Как мне составить список, чтобы получившийся в результате список был подобен желаемому результату? Если я продолжу анализ в этом списке, мне нужно будет легко получить доступ к элементам.

4b9b3361

Ответ 1

Может быть, это то, что вы хотите иметь:

# Initial list:
myList <- list()

# Now the new experiments
for(i in 1:3){
  myList[[length(myList)+1]] <- list(sample(1:3))
}

myList

Ответ 2

outlist <- list(resultsa)
outlist[2] <- list(resultsb)
outlist[3] <- list(resultsc)

append Файл справки говорит, что он предназначен для векторов. Но его можно использовать здесь. Я думал, что пробовал это раньше, но в коде OP были какие-то странные аномалии, которые могут ввести меня в заблуждение:

outlist <- list(resultsa)
outlist <- append(outlist,list(resultsb))
outlist <- append(outlist,list(resultsc))

Те же результаты.

Ответ 3

Есть два других решения, которые включают присвоение индексу один за концом списка. Вот решение, которое использует append.

resultsa <- list(1,2,3,4,5)
resultsb <- list(6,7,8,9,10)
resultsc <- list(11,12,13,14,15)

outlist <- list(resultsa)
outlist <- append(outlist, list(resultsb))
outlist <- append(outlist, list(resultsc))

который дает ваш запрошенный формат

> str(outlist)
List of 3
 $ :List of 5
  ..$ : num 1
  ..$ : num 2
  ..$ : num 3
  ..$ : num 4
  ..$ : num 5
 $ :List of 5
  ..$ : num 6
  ..$ : num 7
  ..$ : num 8
  ..$ : num 9
  ..$ : num 10
 $ :List of 5
  ..$ : num 11
  ..$ : num 12
  ..$ : num 13
  ..$ : num 14
  ..$ : num 15

Ответ 4

Этот ответ похож на принятый, но немного менее запутанный.

L<-list()
for (i in 1:3) {
L<-c(L, list(list(sample(1:3))))
}

Ответ 5

Поместив сначала список переменных в переменную

myVar <- list()

он открывает возможность поиска по иерархии

myVar[[1]] <- list()
myVar[[2]] <- list()

и так далее... поэтому теперь можно сделать

myVar[[1]][[1]] <- c(...)
myVar[[1]][[2]] <- c(...)

или

myVar[[1]][['subVar']] <- c(...)

и т.д.

также можно назначить прямые имена (вместо $)

myVar[['nameofsubvar]] <- list()

а затем

myVar[['nameofsubvar]][['nameofsubsubvar']] <- c('...')

Важно помнить, что всегда используйте двойные скобки, чтобы заставить систему работать

то для получения информации просто

myVar$nameofsubvar$nameofsubsubvar

и т.д.

Пример:

a <-list()
a[['test']] <-list()
a[['test']][['subtest']] <- c(1,2,3)
a
$test
$test$subtest
[1] 1 2 3


a[['test']][['sub2test']] <- c(3,4,5)
a
$test
$test$subtest
[1] 1 2 3

$test$sub2test
[1] 3 4 5

приятная особенность R-языка в нем по-поисковому определению...

Я использовал его для сложной реализации (с более чем двумя уровнями), и он работает!