equivalente de un dictado de python en R

82

Quiero hacer el equivalente de un dictado de Python en R. Básicamente, en Python tengo:

visited = {}

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

La idea es, si vi ese atom_count específico, he visitado [atom_count] = 1. Por lo tanto, si veo ese atom_count de nuevo, no "Do Stuff". Atom_Count es un número entero.

¡Gracias!

usuario1357015
fuente
5
Vea el paquete R hashcon sus funciones de acceso casi similares a las de Python.
Hans W.
@Chase que costaría O (n). El acceso al elemento Dict es constante.
anilbey

Respuestas:

72

Lo más parecido a un dictado de Python en R es simplemente una lista. Como la mayoría de los tipos de datos R, las listas pueden tener un atributo de nombres que puede permitir que las listas actúen como un conjunto de pares nombre-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 el descargo de responsabilidad habitual: no son exactamente lo mismo; Habrá diferencias. Por lo tanto, estará invitando a la decepción al intentar usar literalmente listas exactamente de la forma en que podría usar un dictado en Python.

joran
fuente
¿Cómo se puede iterar programáticamente a través de dicha lista? el ingenuo l$names(l)[1]obviamente falla. tampoco he podido ir l[which()]al trabajo
3pitt
@MikePalmice Aparte de un forbucle, que es una especie de opción en casi todos los idiomas, existe lapply. También hay cosas relacionadas con diferente sintaxis, como Map, y un paquete completo, purrr para muchas cosas de programación funcional.
joran
@MikePalmice, creo que l[[names(l)[1]]debería funcionar. De todos modos, puedes iterar así: l[[1]]sin usar los nombres. Observe que los corchetes simples []devolverán una lista, mientras que los corchetes dobles [[]]devolverán el objeto dentro de la lista.
Javi_VM
1
wow, algo tan simple en otros idiomas es difícil en r? Digamos que tengo una cadena contenida en una variable. Si trato de convertirlo en una clave, simplemente elige el nombre de la variable como el nombre de la clave en lugar del valor de la variable.
wondim
1
@wondim Puede ajustar nombres de la lista de elementos de una variable con names(list) <- vector_of names, misiones con subjuegos funciona tan bien, names(list)[1] <- "foo". Vea también setNames().
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 de talkstats con código R de muestra:

ENLACE DE TABLA HASH

Tyler Rinker
fuente
data.tableLas búsquedas de vectores con nombre de Note y R han mejorado drásticamente en velocidad desde este momento.
Tyler Rinker
4

Si, como en su caso, solo desea que su "diccionario" almacene valores del mismo tipo, simplemente puede usar un vector y nombrar cada elemento.

> l <- c(a = 1, b = 7, f = 2)
> l
a b f 
1 7 2

Si desea acceder a las "claves", utilice names.

> names(l)
[1] "a" "b" "f"
usuario2739472
fuente