2014-09-19 82 views
9

全球環境似乎有名字R_GlobalEnv如何將名稱應用於環境?

environment() 
# <environment: R_GlobalEnv> 

我想一個名字附加到一個新的環境e所以,如果我命名爲myEnv,它讀取

e 
# <environment: myEnv> 

但似乎這不可能。在new.env中沒有任何參數允許這樣做,而attr<-似乎不起作用。

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

是否可以命名環境,維護字節碼,並如上所示打印?

回答

16

?environment

系統環境,如底座,全球和空 環境,有名字爲做包和命名空間環境 和生成的「附加()」。其他環境可以給人一種「‘名’」屬性

因此被命名爲 :

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

根據用於打印環境(如./src/main/printutils.c的r66641)的代碼,你不能讓它打印爲:

> e 
<environment: myEnv> 

這裏是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

你可以給它一個類,並用一個S3 print方法

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

結合@ thelatemail的答案跟我的......你可以做到這一點

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> 
相關問題