2009-07-09 12 views

risposta

57

Gli elenchi R possono essere considerati come hash-vettori di oggetti a cui è possibile accedere per nome. Con questo approccio è possibile aggiungere una nuova voce alla lista in questo modo:

key <- "width" 
value <- 32 

mylist <- list() 
mylist[[ key ]] <- value 

Qui usiamo la stringa memorizzata nella variabile chiave per accedere a una posizione nella lista come quando si utilizza il valore memorizzato in una variabile del ciclo i per accedere a un vettore attraverso:

vector[ i ] 

Il risultato è:

myList 
$width 
[1] 32 
+2

Grazie! Non capisco ancora questo operatore di indicizzazione. Sebbene sia spiegato qui: http://cran.r-project.org/doc/manuals/R-lang.html#Indexing, l'utilizzo che hai mostrato non è descritto. C'è qualche documento online dove questo è descritto correttamente? – Frank

+0

Se i valori sono tipi di base (ad esempio singolo numerico, carattere, ecc.) È possibile utilizzare un array regolare come: x <- c (1, 4, 2, 5). Assegna quindi nomi a ciascun valore di indice come: nomi (x) <- c ('a', 'b', 'c', 'd'). Puoi quindi riferirti a loro come x ['a'], x ['b'], ecc. – JAponte

13

elementi Lista in R possono essere nominati. Quindi nel tuo caso solo fare

> mylist = list() 
> mylist$width = value 

Quando R incontra questo codice

> l$somename=something 

dove L è una lista. Aggiunge ad un elemento un elemento e lo chiama con il nome somename. E 'poi possibile accedere utilizzando

> l[["somename"]] 

o

> l$somename 

Il nome può essere cambiato con i nomi dei comandi:

> names(l)[names(l)=="somename"] <- "othername" 

O se ora la posizione dell'elemento nella elenco:

> names(l)[1] <- "someothername" 
7

La funzione integrata setNames() semplifica la creazione di un hash da una determinata lista di chiavi e valori. (Grazie a Nick K per il suggerimento migliore.)

utilizzati: hh <- setNames(as.list(values), keys)

Esempio:

players <- c("bob", "tom", "tim", "tony", "tiny", "hubert", "herbert") 
rankings <- c(0.2027, 0.2187, 0.0378, 0.3334, 0.0161, 0.0555, 0.1357) 
league <- setNames(as.list(rankings), players) 

Poi accedere ai valori tramite i tasti è semplice:

league$bob 
[1] 0.2027 
league$hubert 
[1] 0.0555 
+2

'league2 <- setNames (as.list (classifiche), giocatori)' è circa 4,5 volte più veloce, e dal momento che usa funzioni vettoriali, sarebbe un modo più "R" per farlo. (Demo 'microbenchmark :: microbenchmark (campionato <- as.hash (giocatori, classifiche), league2 <- setNames (as.list (classifiche), giocatori), times = 1000)') –

+0

@NickK: accetta, 'setNames' è una soluzione molto migliore! Ho sostituito con esso la funzione definita dall'utente. Saluti! –

Problemi correlati