2011-09-29 9 views
14

Quando si aggiunge un elemento con nome a un elenco, è garantito che l'elemento verrà aggiunto alla fine dell'elenco? In pratica sembra essere il caso, ma non è sicuro se si tratta di un'assunzione pericolosa?Aggiunta di un elemento denominato all'elenco con nome, garantito per l'aggiunta alla fine dell'elenco?

test = list() 
test[[ "one" ]] = 1 
test[[ "two" ]] = 2 # will always appear after "one"? 
test[[ "three" ]] = 3 # will always appear after "two"? 
+0

Per essere chiari, si sta utilizzando un tasto stringa '[['uno']]' o '[['1']]' non un tasto numerico '[[1]]'. E possiamo prendere tutte le chiavi delle stringhe in un ordine di confronto? Puoi fare chiavi di stringa come '[['1']]' invece di '[['one']]'? – smci

risposta

20

Se non è documentato (e non sembra essere), allora non vorrei contare su di esso. È possibile garantire che appare alla fine della lista facendo qualcosa di simile:

test <- list() 
test <- c(test, one=1) 
test <- c(test, two=2) 
test <- c(test, three=3) 
+2

Ma stai molto attento a come aggiungi roba a una lista. guarda il risultato di 'Rgames: tl <- list()' 'Rgames: tl [[1]] <- list (one = 1)' 'Rgames: tl [[2]] <- data.frame (two = 2) ' ' Rgames: tl $ three <- 3' –

+0

@CarlWitthoft: il comportamento può essere differente per 'tl [['2']]' vs 'tl [[2]]' ie string keys (as l'OP fa) rispetto ai tasti numerici (come hai fatto) – smci

+1

'append (test, list (three = 3))' è un'altra opzione – baptiste

3

Ho il sospetto che se si ha approfondito il codice C di R, allora si vedrebbe che era vero, ma come dice Joshua, il suo non documentato. Potresti chiedere a R-dev se un'opinione sul fatto che tale comportamento debba essere documentato. Potrebbe esserci già un codice esistente che dipende da esso.

+2

Spacedman - buon suggerimento di chiedere a R-dev di documentarlo. Grazie! – SFun28

+3

Ummmm .... Ho difficoltà a vedere come i nuovi elementi di una lista (o un dataframe, o un vettore per quella materia), potrebbero essere messi ovunque MA alla "fine". Nel momento in cui si definisce un elemento, viene assegnata una posizione inutilizzata. Enfasi su "non utilizzato". Questo dovrebbe essere ovvio quanto il fatto che aggiungere, ad esempio, un terzo elemento a un elenco con due elementi NON verrà assegnato alla posizione 47-esimo. –

+2

Concordo sul fatto che mettere un elemento al settimo posto di una lista di lunghezza 12 sarebbe perverso, ma perché la fine, e non l'inizio? Quando aggiungi un elemento per nome non fornisci alcuna informazione posizionale, quindi, a meno che non sia documentato diversamente, la lingua è libera di metterlo ovunque. Alcune lingue potrebbero finire per ordinarlo con il valore hash della chiave stringa. – Spacedman

Problemi correlati