2012-05-21 12 views
48

Quiero hacer el equivalente de un diccionario de Python en R. Básicamente, en Python que tiene:equivalente de un diccionario de Python en I

visited = {} 

if atom_count not in visited: 
    Do stuff 
    visited[atom_count] = 1 

La idea es que, si vi que específica, atom_count, me he visitado [atom_count] = 1. Por lo tanto, si veo esa atom_count nuevamente, no hago "Do Stuff". Atom_Count es un número entero.

Gracias!

+0

'ifelse' y' '% en%? – Chase

+4

Vea el paquete R 'hash' con sus funciones de acceso casi similares a las de Python. –

Respuesta

45

Lo más parecido a un dict python en R es simplemente una lista. Como la mayoría de los tipos de datos R, listas de nombres pueden tener un atributo que puede permitir listas para actuar como un conjunto de pares de nombre y valor:

> l <- list(a = 1,b = "foo",c = 1:5) 
> l 
$a 
[1] 1 

$b 
[1] "foo" 

$c 
[1] 1 2 3 4 5 

> l[['c']] 
[1] 1 2 3 4 5 
> l[['b']] 
[1] "foo" 

Ahora para la renuncia de costumbre: no son exactamente la misma; habrá diferencias. Por lo tanto, invitarás a la decepción a tratar de usar literalmente listas exactamente de la misma forma que usarías un dict en python.

+0

¿cómo se puede iterar mediante programación a través de dicha lista? la ingenua 'l $ names (l) [1]' obviamente falla. tampoco he podido hacer que 'l [which()]' funcione –

+0

@MikePalmice Aparte de un bucle 'for', que es una especie de opción en casi todos los idiomas, hay' lapply'. También hay cosas relacionadas con diferentes sintaxis, como 'Map', y un paquete completo, ** purrr ** para muchas cosas de programación funcional. – joran

5

Creo que el uso de una tabla hash (crear un nuevo entorno) puede ser la solución a su problema. Escribiría cómo hacer esto, pero lo hice ayer en talkstats.com.

Si su diccionario es grande y solo tiene dos columnas, este puede ser el camino a seguir. Aquí está el enlace al hilo talkstats con código de ejemplo R:

HASH TABLE LINK

+0

Nota 'data.table' y las búsquedas de vectores nombrados de R han mejorado drásticamente en velocidad desde este momento. –