2014-09-19 7 views
9

L'ambiente globale sembra avere il nome R_GlobalEnvCome posso applicare un nome a un ambiente?

environment() 
# <environment: R_GlobalEnv> 

vorrei associare un nome a un nuovo ambiente e in modo che se io chiamo lo myenv, si legge

e 
# <environment: myEnv> 

Ma non sembra che questo sia possibile. Non ci sono argomenti in new.env che lo consentono e attr<- non sembra funzionare.

e <- new.env() 
attr(e, "names") <- "myEnv" 
# Error in attr(e, "names") <- "myEnv" : names() applied to a non-vector 

È possibile assegnare un nome all'ambiente, mantenere il codice byte e farlo stampare come mostrato sopra?

risposta

16

Da ?environment:

ambienti di sistema, come ad esempio la base, globale e vuoti ambienti, hanno nomi come fanno i pacchetti e namespace ambienti e quelli generati da ‘allegare()’. Altri ambienti possono essere nominati dando un ' 'nome'' attributo

Pertanto:

attr(e, "name") <- "yip" 
e 
#<environment: 0x00000000080974f8> 
#attr(,"name") 
#[1] "yip" 
environmentName(e) 
#[1] "yip" 
5

Secondo il codice utilizzato per stampare ambienti (./src/main/printutils.c come di r66641), non si può ottenere per stampare come:

> e 
<environment: myEnv> 

Ecco la sezione dedicata del printutils.c:

attribute_hidden 
const char *EncodeEnvironment(SEXP x) 
{ 
    const void *vmax = vmaxget(); 
    static char ch[1000]; 
    if (x == R_GlobalEnv) 
    sprintf(ch, "<environment: R_GlobalEnv>"); 
    else if (x == R_BaseEnv) 
    sprintf(ch, "<environment: base>"); 
    else if (x == R_EmptyEnv) 
    sprintf(ch, "<environment: R_EmptyEnv>"); 
    else if (R_IsPackageEnv(x)) 
    snprintf(ch, 1000, "<environment: %s>", 
     translateChar(STRING_ELT(R_PackageEnvName(x), 0))); 
    else if (R_IsNamespaceEnv(x)) 
    snprintf(ch, 1000, "<environment: namespace:%s>", 
     translateChar(STRING_ELT(R_NamespaceEnvSpec(x), 0))); 
    else snprintf(ch, 1000, "<environment: %p>", (void *)x); 

    vmaxset(vmax); 
    return ch; 
} 
6

Si può dare una classe e scrivere un print metodo S3

> e <- new.env() 
> class(e) <- "myClass" 
> print.myClass <- function(x, ...) cat("<environment: myEnv>\n") 
> e 
<environment: myEnv> 

Combinando la risposta di @ thelatemail con la mia ... si potrebbe fare questo

e <- new.env() 
print.myClass <- function(x, ...) cat("<environment: ", environmentName(x), ">\n", sep="") 
class(e) <- "myClass" 
e 
#<environment: > 
attr(e, "name") <- "myEnv" 
e 
#<environment: myEnv> 
Problemi correlati