2012-12-18 8 views
9

Ho cercato di conoscere le diverse strutture dati utilizzate nei linguaggi popolari che ho esperienza con elenchi e dizionari in Python, array associativi in ​​PHP (essenzialmente tabelle hash), vettori in C++, ecc.come sono implementati vettori, matrici e frame di dati in R?

Ho molti colleghi che usano R religiosamente e mi chiedevo come i vettori, le matrici e le cornici di dati siano implementati in R. Quali sono i loro punti di forza e di debolezza? Stavo guardando il codice sorgente ma non sono riuscito a trovare le strutture dei dati. Dove si trovano queste definizioni nel codice sorgente?

+0

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 ...) –

+7

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. –

+0

@ JoshO'Brien che dovrebbe essere una risposta, non un commento (+1 in anticipo). –

risposta

1

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?

0

Un po 'in ritardo, ma voleva segnalare un errore con una delle altre risposte e dare una risposta esplicita. Guarda manuale internals:

https://cran.r-project.org/doc/manuals/R-ints.html#The-_0027data_0027

leggere l'inizio di questa sezione, e la voce di 'INTSXP'. Sembra che i vettori integer siano implementati come una matrice di C int. Analogamente per "REALSXP" e "CHARSXP".

L'implementazione come elenchi concatenati sarebbe stata proibitivamente lenta.

Problemi correlati