2009-07-09 11 views

Respuesta

57

Las listas R se pueden considerar hashes: vectores de objetos a los que se puede acceder por nombre. Usando este enfoque se puede añadir una nueva entrada a la lista de este modo:

key <- "width" 
value <- 32 

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

Aquí se utiliza la cadena almacenada en la variable clave para acceder a una posición en la lista como usar el valor almacenado en una variable de bucle i acceder a través de un vector:

vector[ i ] 

El resultado es:

myList 
$width 
[1] 32 
+2

Gracias:

mylist<-list("width"=32)

también, el ejemplo se refiere! Realmente todavía no entiendo este operador de indexación. Aunque se explica aquí: http://cran.r-project.org/doc/manuals/R-lang.html#Indexing, no se describe el uso que mostró. ¿Hay algún documento en línea donde esto se describa correctamente? – Frank

+0

Si los valores son tipos básicos (por ejemplo, un solo carácter numérico, carácter, etc.) puede usar una matriz regular como: x <- c (1, 4, 2, 5). Luego, asigne nombres a cada valor de índice como: nombres (x) <- c ('a', 'b', 'c', 'd'). Puede referirse a ellos como x ['a'], x ['b'], etc. – JAponte

13

elementos mencionados de R pueden ser nombrados. Así, en su caso acaba de hacer

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

Cuando R se encuentra con este código

> l$somename=something 

donde l es una lista. Agrega una lista de un elemento algo, y lo nombra con el nombre somename. Entonces se puede acceder mediante el uso de

> l[["somename"]] 

o

> l$somename 

El nombre se puede cambiar con los nombres de comandos:

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

O si ahora la posición del elemento en el lista por:

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

La función incorporada setNames() hace que sea fácil crear un hash a partir de listas de claves y valores dados. (Gracias a Nick K para la mejor sugerencia.)

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

Ejemplo:

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) 

A continuación, acceder a los valores a través de las claves es fácil:

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

'league2 <- setNames (as.list (rankings), players)' es aproximadamente 4.5 veces más rápido, y como lo usa funciones vectorizadas, sería una forma más 'R' de hacerlo. (Demo 'microbenchmark :: microbenchmark (league <- as.hash (jugadores, clasificaciones), league2 <- setNames (as.list (clasificaciones), jugadores), times = 1000)') –

+0

@NickK: agree, 'setNames' es una solución mucho mejor! Reemplacé la función definida por el usuario con ella. ¡Aclamaciones! –

Cuestiones relacionadas