web-dev-qa-db-fra.com

Ajouter une liste à une liste de listes dans R

J'ai des problèmes pour ajouter des données à une liste qui est déjà dans un format de liste. J'ai un programme qui exportera des objets de résultats lors d'une boucle de simulation. Les données elles-mêmes sont stockées sous forme de liste de matrices. Mon idée est de stocker ces listes dans une liste, puis d'enregistrer cette liste en tant qu'objet R pour une analyse ultérieure. Toutefois, je ne parviens pas à y parvenir correctement. Je vais montrer ce que j'ai fait avec un petit exemple abstrait en utilisant simplement des valeurs à la place des données de matrice de ma simulation:

Supposons que j'ai exécuté la boucle de simulation 3 fois. Pendant les itérations, les listes de résultats doivent être rassemblées dans une liste que je vais sauvegarder en tant qu’objet R:

Liste pour contenir les autres listes et être enregistré: outlist1 <- list()

Première itération: resultsa <- list(1,2,3,4,5)

outlist <- append(outlist1,resultsa)

Deuxième itération: resultsb <- list(6,7,8,9,10)

outlist <- append(outlist1,b)

Troisième itération: resultsc <- list(11,12,13,14,15)

outlist <- list(outlist2,c)

Cependant, cette solution ne fonctionne pas avec la croissance d'une liste contenant des listes de cette façon, le résultat souhaité est:

>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

Cependant, au lieu de cela, je reçois:

> 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

Comment puis-je développer une liste, telle que la liste résultante formatée ressemble au résultat souhaité? Si je fais une analyse plus approfondie de cette liste, je dois pouvoir accéder facilement aux éléments.

51
Ward9250

Pourriez-vous être ceci, ce que vous voulez avoir:

# Initial list:
myList <- list()

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

myList
68
Daniel Fischer
outlist <- list(resultsa)
outlist[2] <- list(resultsb)
outlist[3] <- list(resultsc)

Le fichier d'aide de append indique que c'est pour les vecteurs. Mais il peut être utilisé ici. Je pensais avoir déjà essayé cela, mais le code du PO comportait certaines anomalies étranges qui pourraient m'avoir induit en erreur:

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

Mêmes résultats.

15
42-

Il existe deux autres solutions qui consistent à affecter un index après la fin de la liste. Voici une solution qui utilise 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))

qui donne le format demandé

> 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
10
Brian Diggs

Cette réponse est similaire à celle acceptée, mais un peu moins compliquée.

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

En mettant une assignation de liste sur une variable en premier

myVar <- list()

il ouvre la possibilité de missions hiearchial par

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

et ainsi de suite ... alors maintenant il est possible de le faire

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

ou

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

etc

il est également possible d'affecter directement des noms (au lieu de $)

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

et alors

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

important de se rappeler est de toujours utiliser des doubles crochets pour que le système fonctionne

alors obtenir des informations est simple

myVar$nameofsubvar$nameofsubsubvar

etc...

exemple:

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

une fonctionnalité intéressante du langage R dans sa définition hiérarchique ...

Je l'ai utilisé pour une implémentation complexe (avec plus de deux niveaux) et ça marche!

4
Jesse Burström