2011-09-14 13 views
6

Estoy tratando de encontrar una manera de usar un mapa hash en R, y después de buscarlo obtengo el R-environment. Pero, ¿cómo puedo repetir todos los elementos en un entorno? salida Cuando ejecuto el siguiente código, que estaba esperando de esta manera:¿Cómo iterar a través de elementos hash, en un entorno R?

Pero consigo dos líneas de NULL en su lugar, ¿cómo puedo conseguir lo que quiero?

map <- new.env(hash=T, parent=emptyenv()) 
assign('a', 1, map) 
assign('b', 2, map) 
for (v in ls(map)) { 
    print(map$v) 
} 
+0

'ls' devuelve nombres, no objetos. Pruebe 'print (map [[v]]' –

Respuesta

10

El uso de "$" dentro de una función donde se desea interpretar la entrada es una fuente común de error de programación. Utilice en su lugar el objeto de formulario [[valor]] (sin las comillas).

for (v in ls(map)) { 
    print(map[[v]]) 
} 
+0

Gracias, hombre, funciona! –

7

Depende de lo que quieras hacer. Supongo que su ejemplo print anterior es algo que está haciendo solo como ejemplo, pero que quizás desee hacer algo más que imprimir.

Si desea obtener un objeto basado en cada elemento de un entorno, utilice eapply(env, function). Funciona como las otras funciones *apply(). Devuelve una lista cuyos objetos son los objetos que creó a partir de la función que se pasó al eapply() y cuyos nombres se copian del entorno.

Por ejemplo, en el caso específico

map <- new.env(hash=T, parent=emptyenv()) 
assign('a', 1, map) 
assign('b', 2, map) 

eapply(map, identity) 

devuelve una lista de los dos elementos. Se parece mucho a una tabla hash que muestra que se puede implementar una tabla hash como una lista en lugar de un entorno (que es un poco heterodoxo, pero definitivamente interesante).

Para ver cómo podría funcionar para alguna función no trivial, de encargo, aquí es un ejemplo

eapply(map, function(e) { 
    # e here stands for a copy of an element of the environment 
    e <- my.function(e) 
    my.other.function(e) 
}) 

Si por el contrario quiere hacer algo para cada uno de los elementos de un entorno, sin volver un objeto de lista al final, debe usar un bucle for como @DWin lo hizo en su respuesta.

Mi preocupación, sin embargo, es que no querrá simplemente imprimir sino que eventualmente creará objetos basados ​​en los elementos de su "tabla hash" y los volverá a meter en una lista para su posterior procesamiento. En ese caso, realmente debería usar eapply(). El código será más limpio y se apegará más a los modismos de R. Se encarga de iterar y crear la lista de resultados para usted.

+0

Sería mejor proporcionar un ejemplo para resolver el problema del OP: 'eapply (map, identity)' – James

+0

El problema del OP es que no sabe cómo iterar a través de un Entorno. Y le conté acerca de una práctica función para hacer eso. Una que sigue bastante bien las expresiones de R. – adamleerich

+0

Es cierto, pero también tenía un uso de caso específico, la respuesta es mejor ahora, así que ya me has votado. : debido a sus efectos secundarios 'print' no siempre da lo que espera cuando se usa en las declaraciones' * apply'. – James

Cuestiones relacionadas