Quel est le problème avec l'initialisation d'un objet de la matrice à NULL
, puis en croissance avec cbind()
et rbind()
? Si le nombre de lignes et de colonnes n'est pas connu a priori, n'est-il pas nécessaire de passer de NULL
? Editer: Ma question a été motivée par le besoin de comprendre les façons efficaces d'écrire du code R en mémoire. Le contexte matriciel est plus général et je cherche probablement des suggestions sur des moyens efficaces de gérer d'autres objets de données. Excusez-moi d'être trop abstrait/générique, mais je n'ai pas vraiment de problème spécifique en tête.Growing matrices dans R de NULL
1
A
Répondre
2
Il serait utile que vous fournissiez plus de détails sur ce que vous essayez de faire. Un "problème" (s'il y en a un?) Est que chaque fois que vous "développez" la matrice, vous allez recréer la matrice entière à partir de rien, ce qui est très inefficace. Une méthode alternative serait de stocker chaque objet dans votre environnement local (avec la fonction assign()
), puis d'assembler votre matrice à la fin une fois que vous savez comment insérer une valeur dans une matrice dans R.
beaucoup d'objets sont (avec get()
).
Petite clarification. Je crois que vous avez raison de dire que la croissance de la matrice est inefficace (bien que réellement inefficace dans le temps, pas inefficace pour la mémoire). Mais je crois que l'interpréteur R * effectue * efficacement les mises à jour de cellules individuelles dans une matrice ou un vecteur. C'est-à-dire: 'a <- rep (1,10); a [[1]] <- 2' ne copie pas le vecteur entier dans la deuxième affectation, comme le ferait une implémentation purement fonctionnelle. (Ceci est dû à la lecture du livre de Chambers - quelqu'un ayant la connaissance de la source R s'il vous plaît corriger si faux!) – Harlan
Bien, mais faire une mise à jour n'est pas la même chose que de commencer la matrice comme NULL et ensuite "ajouter" avec rbind/cbind (comme décrit dans la question). Dans votre exemple, vous avez démarré avec une taille de vecteur 10, puis modifié les valeurs. L'initialisation à la taille correcte avec rep et ensuite la modification des valeurs * est * très efficace. – Shane