2011-11-21 13 views
10

Sto cercando di comprendere i concetti di base del linguaggio di programmazione R e sto trovandolo difficile dal momento che R è orientato verso la statistica anziché la programmazione generica. Non riesco a trovare nulla di simile a puntatori/riferimenti. Come implementeresti un elenco collegato, un albero di ricerca, ecc. All'interno del linguaggio R?Roll Your Own Linked List/Tree in R?

Nota: Capisco che se in realtà stai arrotolando le tue strutture di dati autoreferenziali in R, probabilmente c'è un modo migliore per realizzare ciò che stai cercando di realizzare. Tuttavia, credo che una risposta mi aiuterà a capire meglio la struttura generale e i concetti della lingua.

Edit: Per quanto riguarda il commento di Matt Shotwell, il punto della questione è che io sto cercando di scrivere le liste concatenate e alberi modo pulito, entro R, non come estensione scritta in C o qualche altra lingua. Farlo come un'estensione o mescolarsi con dettagli arcani dell'interprete sconfigge lo scopo.

+0

Ecco un paio di lead: 1)? Parilist 2) ricerca 'riferimento debole' e 'puntatore esterno' nel manuale 'R Internals' e 'Scrittura R estensioni' manuale. –

risposta

15

Un elenco collegato in R può essere rappresentato come un vettore, in genere uno list. Non è necessario scrivere un codice speciale per fare riferimento agli elementi successivo e precedente, perché R lo fa per te tramite l'indicizzazione.

Per aggiungere un nuovo elemento all'elenco, è sufficiente tenere traccia della sua lunghezza e assegnarlo alla riga successiva.

lst <- list() # creates an empty (length zero) list 
lst[[1]] <- 1 # automagically extends the lst 
lst[[2]] <- 2 # ditto 

Questo può essere inefficiente per lunghi elenchi a causa del modo in cui R gestisce la memoria. Se possibile, crea l'elenco in anticipo e assegna i loro contenuti non appena disponibili.

lst <- list(1, 2, 3, 4, 5) # a list of 5 items 

lst <- vector("list", 10000) # 10000 NULLs 
lst[[1]] <- 1 
lst[[10000]] <- 10000 # lst now contains 1, NULL, ..., NULL, 10000 

L'eliminazione di un elemento dall'elenco può essere eseguita con indici negativi.

lst <- list(1, 2, 3, 4, 5) 
lst <- lst[-2] # now contains 1, 3, 4, 5 

Un albero è solo un elenco contenente altri elenchi.

tree <- list(list(1, 2), list(3, list(4, 5))) 

# left child: list(1, 2) 
tree[[1]] 

# right child 
tree[[2]] 

# right child of right child:list(4, 5) 
tree[[2]][[2]] 

Per default non v'è incorporato nel far rispettare della struttura, ad esempio solo due bambini per nodo per un albero binario. Approcci più strutturati sono disponibili tramite le classi S4, ma questo farà il lavoro in un pizzico.

+1

+1 Risposta molto buona. – Iterator

+3

A livello interno, un 'elenco' è solo un tipo di vettore. Un 'pairlist' è una vera lista collegata. –

+0

@Joshua: true, ma per la maggior parte delle cose si vorrebbe una lista concatenata, un normale 'elenco' funzionerà perfettamente e sarà meno oscuro, specialmente per chi è nuovo a R. –

Problemi correlati