在什么情况下应该使用new.env来创建新环境?

时间:2010-07-16 18:04:45

标签: r

在“什么是最有用的R技巧?”中(here),我读到使用环境提供“传递参考功能”。这种方法有任何限制和/或陷阱吗?

此外,一般来说,使用创建环境的优缺点是什么?这是我一直困惑的事情,所以任何清晰度或参考对我都非常有帮助。

提前谢谢。

2 个答案:

答案 0 :(得分:33)

虽然我同意Harlan的总体建议(即除非你理解,否则不要使用某些东西),我会补充说:

环境是R中的基本概念,在我看来,非常有用(换句话说:它们值得理解!)。环境对于理解与范围相关的问题非常重要。在这种情况下你应该理解的一些基本的东西:

  1. search():会告诉你工作区;环境按优先级顺序列出。主要环境是.GlobalEnv,并且可以随时引用。
  2. ls():将向您展示环境中包含的内容
  3. attach / detach:为对象创建新环境
  4. getassign<<-<-:您应该知道这些功能之间的区别
  5. with:一种在不附加环境的情况下处理环境的方法。
  6. 另一个指针:看看the proto package(在ggplot中使用),它使用环境来提供受控继承。

    最后,我要指出环境与列表非常相似:它们都可以在其中存储任何类型的对象(请参阅this question)。但是根据您的使用情况(例如,您是否要处理继承和优先级),列表可以更容易使用。并且您始终可以attach列表作为环境。

    编辑:如果您想在proto中查看ggplot工作的示例,请查看ggplot对象的结构,它本质上是一个列表部分由环境组成:

    > p <- qplot(1:10, 1:10)
    > str(p)
    List of 8
     $ data       :'data.frame':    0 obs. of  0 variables
     $ layers     :List of 1
      ..$ :proto object 
     .. .. $ legend     : logi NA 
     .. .. $ inherit.aes: logi TRUE 
    ...
    > class(p$layers[[1]])
    [1] "proto"       "environment"
    > is.environment(p$layers[[1]])
    [1] TRUE
    

    注意它是如何使用proto构建的,因此包含许多环境。您还可以使用graph.proto绘制这些对象中的关系。

答案 1 :(得分:5)

好吧,如果你不理解它们,那些你可能有一天必须阅读你的代码(包括你未来的自己)的人不理解环境,那你就不应该使用它们!它们被设计用于封装包等中的名称空间。您可以使用它们进行传递引用和哈希表这一事实并不一定意味着应该。这是一个技巧。一般来说,使用deep magic并不可取,即使它使您的代码更快一些。