Ici, nous allons à nouveau: ajout d'un élément à une liste, en R
Je ne suis pas heureux avec la accepté de répondre à Ajouter un objet à une liste de R dans amorti de la constante de temps?
> list1 <- list("foo", pi)
> bar <- list("A", "B")
Comment puis-je ajouter de nouvelles élément bar
à list1
? Clairement, c()
ne fonctionne pas, il s'aplatit bar
:
> c(list1, bar)
[[1]]
[1] "foo"
[[2]]
[1] 3.141593
[[3]]
[1] "A"
[[4]]
[1] "B"
Affectation à l'index des œuvres:
> list1[[length(list1)+1]] <- bar
> list1
[[1]]
[1] "foo"
[[2]]
[1] 3.141593
[[3]]
[[3]][[1]]
[1] "A"
[[3]][[2]]
[1] "B"
Quelle est l'efficacité de cette méthode? Est-il un moyen plus élégant?
c(list1,list(bar))
? Veuillez utiliser le package microbenchmark de référence à vous-même.- Préférez-vous la performance, l'élégance ou d'un compromis de deux? Est toutes vos données connues pour être de chaîne, ou pourrait être arbitraire? Veuillez préciser la question, le titre et le texte en conséquence.
- Double Possible de Ajouter un objet à une liste de R dans amortis à temps constant, O(1)?
- Quelqu'un peut dire pourquoi c() ne fonctionne pas et aplati les valeurs?
- parce que sémantiquement
c()
est surchargé. Il construit des vecteurs à partir des éléments, et aussi par la concaténation de vecteurs. - Seriez-vous en mesure d'expliquer la suite d'un comportement? Alors que l'ajout de la liste c() s'aplatit, mais pas lors de la création de la liste. un<-list(c("bonjour, bonjour"),2) > a [[1]] [1] "bonjour, salut" [[2]] [1] 2 append(a,c (le"quoi","voir")) [[1]] [1] "bonjour, salut" [[2]] [1] 2 [[3]] [1] "ce" [[4]] [1] "voir"
- Il n'a rien à voir avec
c()
, vous observez un comportement différent entrelist()
etappend()
. Pouvez-vous expliquer pourquoi vous trouvez qu'il est surprenant?
InformationsquelleAutor user443854 | 2013-06-11
Vous devez vous connecter pour publier un commentaire.
Ajout d'éléments à une liste est très lent en faire un élément à la fois. Voir ces deux exemples:
Je vais garder le
Result
variable dans l'environnement mondial afin d'éviter les copies à l'évaluation de cadres et de raconter des R où le chercher avec.GlobalEnv$
, pour éviter un aveugle de recherche avec<<-
:Lent. Maintenant, nous allons essayer la deuxième approche:
Encore lent.
Maintenant, nous allons essayer d'utiliser un
environment
, et la création de nouvelles variables à l'intérieur de cet environnement, au lieu d'ajouter des éléments à une liste. Le problème ici est que les variables doivent être nommées, donc je vais utiliser le compteur comme une chaîne de caractères pour un nom à chaque élément de "slot":Whoa beaucoup plus rapide. 🙂 C'est peut être un peu maladroit, mais il fonctionne.
Une dernière approche utilise une liste, mais au lieu d'augmenter sa taille un élément à la fois, il double la taille à chaque fois que la liste est complète. La taille de la liste est également conservée dans une variable, pour éviter tout ralentissement à l'aide de
length
:C'est encore plus rapide. Et aussi facile à un travail comme une liste.
Essayons de ces deux dernières solutions avec plus d'itérations:
Bien, la dernière est définitivement la voie à suivre.
[[]]
avec différents nombre d'éléments:2e3
s'exécute 100x plus rapide que2e4
, clairement O(N^2), de sorte que l'ensemble de la liste est en cours de copie. D'autre part, l'attribution de nom de variable différent à chaque fois prend sur 20x de temps pour2e5
d'éléments par rapport à2e4
éléments, ce qui est O(N) -- les performances que ce que je m'attends à partir de l'ajout d'un élément à une liste..GlobalEnv$
rend la fonction plus rapideC'est très facile. Vous avez juste besoin d'ajouter de la façon suivante :
very easy...
@RichardDes opérations qui modifient la longueur d'une liste/vecteur dans la R toujours copier tous les éléments dans une nouvelle liste, et donc sera lente, en O(n). Le stockage dans un environnement O(1) mais a une plus grande constante de frais généraux. Pour un O(1) ajout et la comparaison d'un certain nombre d'approches, voir ma réponse à l'autre question à https://stackoverflow.com/a/32870310/264177.
v <- c(v, newElement)
. Ajout ou remplacement d'éléments via l'index n'est pas de la programmation fonctionnelle style, cependant. Je ne sais pas la représentation interne des vecteurs dans R, mais à l'aide d'un un array (individuels plus petits tableaux mis en lien dans une chaîne pour former un ensemble plus grand de coeur), pièces qui ne sont pas affectés par l'ajout pourraient être réutilisées sans modification, la suppression de la charge de la GC. Après tout, la base de R n'est pas très bien conçu, ce qui en fait assez difficile de faire des choses simples, parfois.