Od R Internals, 1,1 SEXPs:
... podstawowe cegiełki obiektów R są często zwane węzły ... Oba typy struktury węzła mają na pierwszych trzech pól 32-bit spxinfo nagłówek, a następnie trzy wskaźniki (do atrybutów i poprzedniego i następnego węzła na liście podwójnie połączonej)
Wektory w R są zaimplementowane jako lista podwójnie połączona. I nawet wydaje się, że nie ma struktury danych mniejszej niż lista połączona z jednym węzłem. To oczywiste:
> a <- 4
> a[1]
4
Jak wspomniano przez innych: builtin.c
ma do_makevector
i do_makelist
i array.c
ma źródło do_matrix
. Ponadto array.c
zawiera źródło dla allocMatrix
i memory.c
zawiera źródło dla allocVector
.
Podczas gdy wiele rzeczy, które się działo, było nad moją głową, wydaje się oczywiste, że macierz jest po prostu podwójnie połączoną listą podwójnie powiązanych list. Uważam (choć jestem pewien), że nazwy wierszy i kolumn (podobnie jak te przechowywane w ramce danych) są przechowywane w "atrybutach" każdej listy.
Odpowiedzią na "mocne i słabe strony" implementacji struktur danych byłyby (z mojej ograniczonej wiedzy) listy podwójnie powiązane, które mają siłę w tym, że dynamiczna alokacja pamięci jest prostsza i nie wymaga narzut kopiowania i ponownego przydzielania całej tablicy, a jej słabością (w zależności od tego, ile wskaźników jest na liście: głowa, ogon, środek, ćwiartki, itd.) uzyskanie dostępu do losowej wartości v[99]
może przejąć obciążenie iteracyjne przez kilka elementy przed znalezieniem pożądanego.
Czy to prawda?
Czy http://cran.r-project.org/doc/manuals/r-release/R-lang.html pomaga? (Niekoniecznie: mówi o tym, jak struktury danych są * zdefiniowane *, a nie w jaki sposób są zaimplementowane ...) –
W '$ R_SRC_HOME/src/main /' spójrz na 'builtin.c' dla' do_makevector', a także w 'array.c' dla' do_matrix'. data.frames są po prostu listami klasy 'data.frame', więc możesz po prostu zajrzeć do' do_makelist' (również w 'builtin.c'), a następnie zwrócić kod R przez wpisanie' data.frame' w twoim R konsola. Dla pełnego obrazu, instrukcje R mogą być bardziej pomocne: Zobacz ten @BenBolker połączony z, a także ["R-internals"] (http://cran.r-project.org/doc/manuals/R-ints) .html) instrukcja. –
@ JoshO'Brien, który powinien być odpowiedzią, a nie komentarzem (+1 z góry). –