Добавление списка к списку списков в 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
как мне вырастить список, чтобы полученный список был отформатирован как желаемый результат? Если я сделаю дальнейший анализ этого списка, мне нужно будет легко получить доступ к элементам.
5 ответов
может быть, это то, что вы хотите иметь:
# Initial list:
myList <- list()
# Now the new experiments
for(i in 1:3){
myList[[length(myList)+1]] <- list(sample(1:3))
}
myList
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))
те же результаты.
есть два других решения, которые включают присвоение индексу одного после конца списка. Вот решение, которое использует 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
этот ответ похож на принятый, но немного менее запутанный.
L<-list()
for (i in 1:3) {
L<-c(L, list(list(sample(1:3))))
}
, поставив назначение списка на переменную first
myVar <- list()
это открывает возможность hiearchial назначения по
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 в его hiearchial определении...
я использовал его для сложной реализации (с более чем двумя уровнями), и он работает!