Da R Internals, 1.1 SEXPs:
... gli elementi di base di oggetti R sono spesso chiamati nodi ... Entrambi i tipi di struttura del nodo hanno come loro primi tre campi a 32 bit spxinfo intestazione e quindi tre puntatori (agli attributi e al nodo precedente e successivo in una lista doppiamente collegata)
Così i vettori in R sono implementati come una lista doppiamente collegata. Inoltre, sembra che non ci sia una struttura di dati più piccola di una lista collegata a un nodo singolo. Ciò è evidente dal:
> a <- 4
> a[1]
4
Come detto da altri: builtin.c
ha do_makevector
e do_makelist
, e array.c
ha la sorgente per do_matrix
. Inoltre, array.c
contiene la fonte per allocMatrix
e memory.c
contiene la fonte per allocVector
.
Mentre un sacco di cose che stavano succedendo erano sopra la mia testa, sembra evidente che una matrice sia semplicemente una lista doppiamente collegata di liste doppiamente collegate. Credo (anche se non sono sicuro) che i nomi di riga e colonna (come quelli memorizzati in un frame di dati) sono memorizzati negli 'attributi' di ogni lista.
La risposta a "quali sono i punti di forza e di debolezza" dell'implementazione delle strutture di dati sarebbe che (dalla mia conoscenza limitata) le liste doppiamente collegate hanno una forza in quella allocazione dinamica della memoria è più semplice e non richiede il sovraccarico di copia e riallocazione di un intero array, e la debolezza è che (a seconda di quanti puntatori ci sono nella lista: testa, coda, centro, quarti, ecc.) l'accesso a un valore casuale v[99]
può richiedere l'overhead di iterare attraverso diversi elementi prima che venga trovato quello desiderato.
È corretto?
http://cran.r-project.org/doc/manuals/r-release/R-lang.html help? (Non necessariamente: dice come le strutture dati sono * definite *, non come sono implementate ...) –
In '$ R_SRC_HOME/src/main /', guarda in 'builtin.c' per' do_makevector', e in 'array.c' per' do_matrix'. data.frames sono solo elenchi di classe 'data.frame', quindi potresti semplicemente dover guardare' do_makelist' (anche in 'builtin.c') e poi il codice R restituito digitando' data.frame' nella tua R console. Per il quadro generale, i manuali di R possono essere più utili: vedere quello @BenBolker collegato e anche ["R-internals"] (http://cran.r-project.org/doc/manuals/Rints .html) manuale. –
@ JoshO'Brien che dovrebbe essere una risposta, non un commento (+1 in anticipo). –