2012-10-02 16 views
6

¿Cuál es la manera de mostrar el nombre del entorno dentro de la función como funciones incorporadas? Por ejemplo, cuando escribo la función: mean disponible en el paquete base, puedo ver el entorno como "namespace: base".R: Funciones: ¿muestra el nombre del entorno en lugar de la dirección de memoria de ese entorno?

mean 

    function (x, ...) 
    UseMethod("mean") 
    <bytecode: 0x0547f17c> 
    **<environment: namespace:base>** 

Sin embargo, cuando hay que adjuntar una función para el medio ambiente de nueva creación, aquí para acceder a los valores de la variable libre (z) dentro de la función (f), que reside de forma automática en el entorno .GlobalEnv y el nombre de el entorno no se muestra dentro de la función, pero se ve la dirección de memoria "0x051abd60" del entorno (e1).

 e1 <- new.env() 
    e1$z <- 10 
    f <- function(x) { 
      x + z 
     } 
    environment(f) = e1 
    f 

       function(x) { 
        x + z 
       } 
       **<environment: 0x051abd60>** 

¿Qué te parece este comportamiento? ¿Por qué no obtengo el nombre de mi entorno dentro de la función como funciones incorporadas de R y también las funciones disponibles de varios paquetes R? ¿Hay alguna diferencia entre la estructura de datos del entorno y el entorno .GlobalEnv disponible de la búsqueda()

Cualquier sugerencia sobre la motivación detrás de este comportamiento sería muy apreciada.

Gracias

Respuesta

4

Si no recuerdo mal, los nombres de entorno para los paquetes y espacios de nombres se asignan en el nivel C. Por lo tanto, los entornos creados por el usuario no revelan nombres. No puede establecer un nombre de entorno en R aunque haya una función base (llamada erróneamente) llamada environmentName(). Solo devolverá el nombre asignado a nivel C. En realidad, solo está destinado a paquetes y espacios de nombres, no a otros entornos.

+0

He intentado añadir un nombre para el medio ambiente mediante el environmentName (e1) <- "E1", pero tiene un error como "no se pudo encontrar la función environmentName ...". Además, cada entorno tiene un perfil único para ellos. Todavía no he trabajado con paquetes, pero es interesante saber el comportamiento de los espacios de nombres aplicados a las variables y sus estructuras de datos en R – Sathish

+0

¿Ha adivinado algún propósito para la función environmentName()? – Sathish

3

La mayoría de los entornos no tienen nombres: el nombre de un entorno es un atributo especial del entorno, no el nombre del objeto que apunta a ese entorno. P.ej. en el siguiente caso, ¿qué esperarías del "nombre" del entorno de f?

e1 <- new.env() 
e1$z <- 10 
e2 <- e1 
e3 <- e1 

f <- function(x) { 
    x + z 
} 
environment(f) <- e1 

identical(e1, e2) 
identical(e1, e3) 
+0

No existe un nombre para el entorno de f, pero se le asigna el puntero a e1 o e2 o e3. – Sathish

+0

Mi comprensión con los entornos es que hay algunos entornos que tienen un "atributo especial de nombre". Por ejemplo: los entornos integrados vienen con un nombre, pero los entornos definidos por el usuario no permiten agregarle un atributo especial de nombre. Sin embargo, no veo ningún uso específico de tener este atributo especial para los entornos definidos por el usuario ya que los entornos están vinculados a otros objetos con su nombre de objeto e internamente se asigna un puntero para que interactúe entre el entorno y su objeto asignado. – Sathish

+0

Gracias por su explicación :) +1 – Sathish

0

Se puede configurar un nombre de entorno usando attr, así:

e <- new.env() 
attr(e, "name") <- "xyzzy" 

environmentName(e) 
## [1] "xyzzy" 
Cuestiones relacionadas