2014-09-19 22 views
9

Môi trường toàn cầu dường như có tên R_GlobalEnvLàm cách nào để áp dụng tên cho môi trường?

environment() 
# <environment: R_GlobalEnv> 

Tôi muốn đính kèm một tên cho một môi trường mới e để nếu tôi đặt tên cho nó myEnv, nó đọc

e 
# <environment: myEnv> 

Nhưng nó không có vẻ như thế này là có thể. Không có đối số trong new.env cho phép điều này và attr<- dường như không hoạt động.

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

Có thể đặt tên cho môi trường, duy trì mã byte và in mã như được hiển thị ở trên không?

Trả lời

16

Từ ?environment:

hệ thống môi trường, chẳng hạn như là cơ sở, toàn cầu và trống rỗng môi trường, có những cái tên như làm gói và namespace môi trường và những tạo ra bởi ‘đính kèm()’. môi trường khác có thể được đặt tên bằng cách đưa ra một 'tên "' thuộc tính

Do đó:

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

Theo mã được sử dụng để in các môi trường (./src/main/printutils.c như của r66641), bạn không thể có được nó để in như:

> e 
<environment: myEnv> 

Dưới đây là phần có liên quan của 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

Bạn có thể cung cấp cho nó một lớp và viết một S3 print phương pháp

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

Kết hợp câu trả lời @ thelatemail với tôi ... bạn có thể làm điều này

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> 
Các vấn đề liên quan