Wie werden Vektoren, Matrizen und Datenrahmen in R implementiert? ___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ qstntxt ___

Ich habe versucht, über die verschiedenen Datenstrukturen zu lernen, die in populären Sprachen verwendet werden, wie Listen und Wörterbücher in Python, assoziative Arrays in PHP (im Wesentlichen Hash-Tabellen), Vektoren in C ++, usw.

Ich habe eine Menge Kollegen, die R religiös verwenden, und ich habe mich gefragt, wie Vektoren, Matrizen und Datenrahmen in R implementiert werden. Was sind ihre Stärken und Schwächen? Ich habe den Quellcode durchgesehen, aber ich konnte die Datenstrukturen nicht selbst finden. Wo befinden sich diese Definitionen im Quellcode?

    
___ tag123r ___ R ist eine freie, quelloffene Programmiersprache und Softwareumgebung für statistische Berechnungen, Bioinformatik, Visualisierung und allgemeine Datenverarbeitung. Stellen Sie minimale, reproduzierbare, repräsentative Beispiele für Ihre Fragen bereit. Verwenden Sie dput () für Daten und geben Sie alle Nicht-Basis-Pakete mit Bibliotheksaufrufen an. Bilder für Daten oder Code nicht einbetten, eingerückte Codeblöcke verwenden. Verwenden Sie für statistische Fragen http://stats.stackexchange.com. ___ tag123datastrukturen ___ Eine Datenstruktur ist eine Möglichkeit, Daten so zu organisieren, dass bestimmte Eigenschaften dieser Daten effizient abgefragt und / oder aktualisiert werden können. ___ answer13957361 ___

Wie bereits erwähnt, schauen Sie sich auch das Handbuch "R internals" an als diesen Teil von "Writing R extensions" .

    
___ answer41975423 ___

Ein bisschen spät, aber wollte einen Fehler mit einer der anderen Antworten aufzeigen und eine explizite Antwort geben. Sehen Sie sich das Handbuch für Internes an:

Ссылка

Lesen Sie den Anfang dieses Abschnitts und den Eintrag für 'INTSXP'. Es scheint, dass ganzzahlige Vektoren als ein Array von C int implementiert sind. Ähnlich für 'REALSXP' und 'CHARSXP'.

Die Implementierung als verknüpfte Listen wäre zu langsam gewesen.

    
___ answer13978972 ___

Von R Internals, 1.1 SEXPs:

  

... die Grundbausteine ​​von R-Objekten werden oft Knoten genannt ... Beide Typen von Knotenstrukturen haben als ihre ersten drei Felder einen 32-Bit-spxinfo-Header und dann drei Zeiger (zu den Attributen und dem vorherigen und nächsten Knoten in einer doppelt verknüpften Liste)

Daher sind Vektoren in R als doppelt verknüpfte Liste implementiert. Und es scheint sogar, dass es keine Datenstruktur gibt, die kleiner als eine verknüpfte Liste mit einem einzigen Knoten ist. Dies wird offensichtlich durch:

%Vor%

Wie von anderen erwähnt: %code% hat %code% und %code% und %code% hat die Quelle für %code% . Zusätzlich enthält %code% die Quelle für %code% und %code% enthält die Quelle für %code% .

Während viele Dinge, die sich abspielten, über meinem Kopf lagen, scheint es offensichtlich, dass eine Matrix einfach eine doppelt verknüpfte Liste doppelt verknüpfter Listen ist. Ich glaube (obwohl ich nicht sicher bin), dass Zeilen- und Spaltennamen (wie die in einem Datenrahmen gespeicherten) in den 'Attributen' jeder Liste gespeichert sind.

Die Antwort auf die "Was die Stärken und Schwächen" der Implementierung der Datenstrukturen wäre, dass (aus meinem begrenzten Wissen) doppelt verknüpfte Listen eine Stärke darin haben, dass die dynamische Speicherzuweisung einfacher ist und keinen Overhead erfordert Kopieren und Neuzuweisen eines gesamten Arrays, und die Schwäche ist, dass (abhängig davon, wie viele Zeiger auf die Liste sind: Kopf, Schwanz, Mitte, Viertel usw.) der Zugriff auf einen zufälligen Wert %code% den Overhead des Iterierens in Anspruch nehmen kann mehrere Elemente vor dem gewünschten gefunden.

Stimmt das?

    
___

9

Ich habe versucht, über die verschiedenen Datenstrukturen zu lernen, die in populären Sprachen verwendet werden, wie Listen und Wörterbücher in Python, assoziative Arrays in PHP (im Wesentlichen Hash-Tabellen), Vektoren in C ++, usw.

Ich habe eine Menge Kollegen, die R religiös verwenden, und ich habe mich gefragt, wie Vektoren, Matrizen und Datenrahmen in R implementiert werden. Was sind ihre Stärken und Schwächen? Ich habe den Quellcode durchgesehen, aber ich konnte die Datenstrukturen nicht selbst finden. Wo befinden sich diese Definitionen im Quellcode?

    
clementine 18.12.2012, 21:37
quelle

3 Antworten

4

Wie bereits erwähnt, schauen Sie sich auch das Handbuch "R internals" an als diesen Teil von "Writing R extensions" .

    
Theodore Lytras 19.12.2012, 17:00
quelle
1

Von R Internals, 1.1 SEXPs:

  

... die Grundbausteine ​​von R-Objekten werden oft Knoten genannt ... Beide Typen von Knotenstrukturen haben als ihre ersten drei Felder einen 32-Bit-spxinfo-Header und dann drei Zeiger (zu den Attributen und dem vorherigen und nächsten Knoten in einer doppelt verknüpften Liste)

Daher sind Vektoren in R als doppelt verknüpfte Liste implementiert. Und es scheint sogar, dass es keine Datenstruktur gibt, die kleiner als eine verknüpfte Liste mit einem einzigen Knoten ist. Dies wird offensichtlich durch:

%Vor%

Wie von anderen erwähnt: builtin.c hat do_makevector und do_makelist und array.c hat die Quelle für do_matrix . Zusätzlich enthält array.c die Quelle für allocMatrix und memory.c enthält die Quelle für allocVector .

Während viele Dinge, die sich abspielten, über meinem Kopf lagen, scheint es offensichtlich, dass eine Matrix einfach eine doppelt verknüpfte Liste doppelt verknüpfter Listen ist. Ich glaube (obwohl ich nicht sicher bin), dass Zeilen- und Spaltennamen (wie die in einem Datenrahmen gespeicherten) in den 'Attributen' jeder Liste gespeichert sind.

Die Antwort auf die "Was die Stärken und Schwächen" der Implementierung der Datenstrukturen wäre, dass (aus meinem begrenzten Wissen) doppelt verknüpfte Listen eine Stärke darin haben, dass die dynamische Speicherzuweisung einfacher ist und keinen Overhead erfordert Kopieren und Neuzuweisen eines gesamten Arrays, und die Schwäche ist, dass (abhängig davon, wie viele Zeiger auf die Liste sind: Kopf, Schwanz, Mitte, Viertel usw.) der Zugriff auf einen zufälligen Wert v[99] den Overhead des Iterierens in Anspruch nehmen kann mehrere Elemente vor dem gewünschten gefunden.

Stimmt das?

    
clementine 20.12.2012 19:17
quelle
0

Ein bisschen spät, aber wollte einen Fehler mit einer der anderen Antworten aufzeigen und eine explizite Antwort geben. Sehen Sie sich das Handbuch für Internes an:

Ссылка

Lesen Sie den Anfang dieses Abschnitts und den Eintrag für 'INTSXP'. Es scheint, dass ganzzahlige Vektoren als ein Array von C int implementiert sind. Ähnlich für 'REALSXP' und 'CHARSXP'.

Die Implementierung als verknüpfte Listen wäre zu langsam gewesen.

    
akshan 01.02.2017 08:49
quelle

Tags und Links