2014-09-19 17 views
9

środowisko globalne wydaje się mieć nazwę R_GlobalEnvJak mogę dodać nazwę do środowiska?

environment() 
# <environment: R_GlobalEnv> 

Chciałbym przypisać nazwę do nowego środowiska e tak, że jeśli ja nazwać myEnv, odczytuje

e 
# <environment: myEnv> 

Ale wydaje się, że to nie jest możliwe. Brak argumentów w new.env, które pozwalają na to, a attr<- wydaje się nie działać.

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

Czy można nazwać środowisko, zachować kod bajtowy i go wydrukować, jak pokazano powyżej?

Odpowiedz

16

Od ?environment:

środowisk systemowych, takich jak bazy, globalnych i pustych środowiskach, mają nazwy jak zrobić pakietów i przestrzeni nazw środowisk i tych generowanych przez „attach()”. Innych środowiskach można nazwać dając nazwę „«»” atrybutu

Dlatego:

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

Według kodu używanego do drukowania środowiskach (./src/main/printutils.c jak z r66641), nie można uzyskać to wydrukować jako:

> e 
<environment: myEnv> 

Oto odnośny fragment 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

Można nadać mu klasy i napisać S3 print metoda

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

łącząc odpowiedź @ thelatemail z kopalni za ... można to zrobić

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> 
Powiązane problemy