全球环境似乎名为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
是否可以命名环境,维护字节代码,并将其打印如上所示?
答案 0 :(得分:16)
来自?environment
:
系统环境,例如base,global和empty 环境,具有名称和包和命名空间环境 以及'attach()'生成的那些。可以命名其他环境 通过提供'&#34;名称&#34;'属性
因此:
attr(e, "name") <- "yip"
e
#<environment: 0x00000000080974f8>
#attr(,"name")
#[1] "yip"
environmentName(e)
#[1] "yip"
答案 1 :(得分: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>
答案 2 :(得分:5)
根据用于打印环境的代码(自r66641起./src/main/printutils.c
),您无法将其打印为:
> 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;
}