如何将名称应用于环境?

时间:2014-09-19 01:54:28

标签: r

全球环境似乎名为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

是否可以命名环境,维护字节代码,并将其打印如上所示?

3 个答案:

答案 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;
}