La raison pour laquelle j'aime Rcpp tellement, c'est que je n'arrive pas toujours comment R Core pense, et avec Rcpp, le plus souvent, je n'ai pas.
Philosophiquement parlant, vous êtes dans un état de péché en ce qui concerne le paradigme fonctionnel, qui essaie de faire en sorte que chaque valeur apparaît indépendante de toute autre valeur; de changer une valeur ne doit jamais provoquer un changement visible dans une autre valeur, la façon dont vous obtenez avec des pointeurs de partage de la représentation en C.
Les problèmes surviennent lors de la programmation fonctionnelle des signaux de petites embarcations pour se déplacer hors de la voie, et le petit artisanat répond "je suis un phare". Faire une longue série de petits changements à un grand objet que vous souhaitez traiter dans l'intervalle, vous met en place dans le phare de territoire.
Dans le C++ STL, push_back()
est un mode de vie. Il n'essaie pas d'être fonctionnelle, mais il tente pour accueillir les idiomes de programmation commune efficacement.
Avec une certaine habileté dans les coulisses, on peut parfois s'arranger pour avoir un pied dans chaque monde. Instantané de base de systèmes de fichiers sont un bon exemple (qui a évolué à partir des concepts tels que l'union des montures, qui a également plis des deux côtés).
Si R Core voulions pour ce faire, le sous-jacent vecteur de stockage pourrait fonctionner comme une union de montage. Une référence pour le vecteur de stockage est peut-être valable pour les indices 1:N
, tandis qu'une autre référence au même emplacement de stockage est valable pour les indices 1:(N+1)
. Il pourrait y avoir de stockage réservée pas encore valablement référencé par quoi que ce soit, mais pratique pour un rapide, push_back()
. Vous ne violez pas la notion fonctionnelle lors de l'ajout de l'extérieur de la plage toute référence existante juge valable.
Finalement, ajouter les lignes de manière incrémentielle, vous exécutez hors de stockage réservé. Vous aurez besoin de créer de nouvelles copies de tout, avec la capacité de stockage multipliée par certains incrément. La STL implémentations j'ai utiliser ont tendance à se multiplier de stockage par 2 lors de l'extension de l'allocation. J'ai pensé que j'ai lu dans la R Internes qu'il existe une structure de mémoire où le stockage des incréments de 20%. De toute façon, les opérations de croissance se produisent avec une fréquence logarithmique par rapport au nombre total d'éléments ajoutés. Sur la méthode de l'amortissement, ce qui est normalement acceptable.
Que les trucs de derrière les coulisses aller, j'ai vu pire. Chaque fois que vous push_back()
une nouvelle ligne sur le dataframe, au niveau supérieur de la structure de l'index doivent être copiés. La nouvelle ligne pourrait ajouter sur une représentation commune, sans impact sur toutes les anciennes valeurs fonctionnelles. Je ne pense même pas qu'il ne ferait que compliquer le garbage collector de beaucoup; car je ne suis pas proposer push_front()
toutes les références sont préfixe références à l'avant de l'allocation d'un vecteur de stockage.