5 votes

R attribuer à plusieurs éléments de liste le même objet

J'ai actuellement une boucle - en fait une boucle dans une boucle, dans un modèle de simulation qui devient lent avec un grand nombre d'individus. J'ai vectorisé la majeure partie de la boucle et l'ai rendue beaucoup plus rapide. Mais il y a une partie où j'assigne plusieurs éléments d'une liste comme étant la même chose, simplifiant une grande boucle à la seule tâche que je veux accomplir :

new.matrices[[length(new.matrices)+1]]<-old.matrix

À chaque itération de la boucle, la ligne ci-dessus est appelée, et le même objet matriciel est affecté au nouvel élément suivant d'une liste.

J'essaie de vectoriser cela - si possible, ou de le rendre plus rapide qu'une boucle ou une instruction apply.

Jusqu'à présent, j'ai essayé des trucs du genre :

indices <- seq(from = length(new.matrices) + 1, to = length(new.matrices) + reps)
new.matrices[indices] <- old.matrix

Cependant, le résultat est le message suivant :

Warning message:
In new.effectors[effectorlength] <- matrix :
  number of items to replace is not a multiple of replacement length

Il essaie également d'attribuer une valeur de l'élément old.matrix à un élément de new.matrices comme ça :

[[1]]
[1] 8687

[[2]]
[1] 1

[[3]]
[1] 5486

[[4]]
[1] 0

Lorsque le résultat souhaité est un élément de liste = une matrice entière, une copie de old.matrix

Existe-t-il un moyen de vectoriser le collage d'une matrice en éléments de liste sans boucles ? Avec les boucles telles qu'elles sont actuellement implémentées, nous parlons de plusieurs milliers de répétitions qui ralentissent considérablement les choses, d'où mon désir de vectoriser cela si possible.

2voto

Michele Points 3199

Probablement que vous avez déjà résolu votre problème, de toute façon, le problème dans votre code

new.matrices[indices] <- old.matrix

a été causée par la tentative de remplacer certains objets (les NULL dans votre new.matrices ) avec quelque chose de différent, une matrix . Donc R contraint old.matrix dans un vecteur et essaie de coller chaque valeur unique à un élément de liste différent, (c'est pourquoi vous avez obtenu ce résultat, et quand, disons, reps est 4 ou 8 et old.matrix n'est PAS une matrice 2 x 2, vous obtenez également la formule suivante warning ). En faisant

new.matrices[indices] <- list(old.matrix)

fonctionnera, et R répliquera la liste à un seul élément list(old.matrix) " reps " se répète automatiquement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X