2014-09-19 10 views
9

Die globale Umwelt scheint der Name zu haben R_GlobalEnvWie kann ich einen Namen auf eine Umgebung anwenden?

environment() 
# <environment: R_GlobalEnv> 

Ich möchte einen Namen in eine neue Umgebung e so befestigen, dass, wenn ich es myEnv nennen, liest

e 
# <environment: myEnv> 

Aber das scheint nicht möglich zu sein. Es gibt keine Argumente in new.env, die dies zulassen, und attr<- scheint nicht zu funktionieren.

Ist es möglich, die Umgebung zu benennen, den Byte-Code beizubehalten und wie oben gezeigt drucken zu lassen?

Antwort

16

Von ?environment:

Systemumgebungen wie die Basis, global und leere Umgebungen, haben Namen wie auch die Verpackung und Namespace-Umgebungen und diejenigen, die durch ‚attach()‘. Andere Umgebungen können , indem ein ‚‚name‘‘ Attribut

Deshalb nennen:

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

Nach dem Code verwendet Umgebungen drucken (./src/main/printutils.c ab r66641) können Sie nicht bekommen es zu drucken, wie:

> e 
<environment: myEnv> 

Hier ist der entsprechende Abschnitt von 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

Sie können es eine Klasse geben und schreiben S3 print Methode

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

mit meiner @ thelatemail Antwort Kombination ... könnten Sie diese

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> 
tun
Verwandte Themen