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

R 在什么情况下应使用new.env创建新环境?,r,R,在“什么是最有用的R技巧?”()中,我读到使用环境提供了“通过引用传递功能”。这种方法是否有任何限制和/或缺陷 另外,一般来说,使用创建的环境有哪些优点和缺点?这是我困惑了很长一段时间的事情,所以任何澄清或参考都会对我很有帮助 提前感谢您。如果您不了解它们,并且将来可能需要阅读您的代码的人(包括您未来的自己)不了解环境,那么您不应该使用它们!它们被设计用于封装包中的名称空间等。您可以将它们用于按引用传递和哈希表的事实并不一定意味着您应该这样做。这是个骗局。一般来说,使用并不可取,即使它会使您的代

在“什么是最有用的R技巧?”()中,我读到使用环境提供了“通过引用传递功能”。这种方法是否有任何限制和/或缺陷

另外,一般来说,使用创建的环境有哪些优点和缺点?这是我困惑了很长一段时间的事情,所以任何澄清或参考都会对我很有帮助


提前感谢您。

如果您不了解它们,并且将来可能需要阅读您的代码的人(包括您未来的自己)不了解环境,那么您不应该使用它们!它们被设计用于封装包中的名称空间等。您可以将它们用于按引用传递和哈希表的事实并不一定意味着您应该这样做。这是个骗局。一般来说,使用并不可取,即使它会使您的代码更快。

虽然我同意Harlan的总体建议(即除非您理解,否则不要使用),但我要补充:

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

  • search()
    :将显示工作区;环境按优先级顺序列出。主环境是.GlobalEnv,并且始终可以这样引用
  • ls()
    :将显示环境中包含的内容
  • 附加
    /
    分离
    :为对象创建新环境
  • get
    assign
    is.environment(p$layers[[1]])
    [1] 真的
    

    注意它是如何使用proto构建的,因此包含了许多环境。您还可以使用
    graph.proto

    绘制这些对象中的关系,因此每当我遇到新技巧时,我应该避免使用它,因为我不理解它?我经常通过在函数之间传递大协方差矩阵来对它们执行操作。在这种情况下,使用环境是否会提高性能,足以保证使用它们?我不完全确定实现细节,但我相信如果不修改函数中的大型矩阵,它们实际上不会被复制。至于你更大的问题,我建议,如果你需要速度,也许值得学习这个魔法,记住这样做是对语言语义的(轻微)滥用,你以后可能会后悔。或者,你可能不会后悔+我想谈谈哈兰的担忧:是的,这是一种危险的用法,因为它会带来“副作用”。每当你允许一个函数改变外部世界时,你就是在向意想不到的行为敞开大门+1.谢恩的评论。在这个日益平行化的世界里,开始减少副作用的使用是一个很好的做法。我希望了解它们,以便我能够潜在地使用它们。我对R中的作用域规则和您列出的大多数函数有些熟悉,但我将更深入地探讨其中的细节。谢谢你的信息。完全同意,Shane!如果您正在构建大量代码,那么了解R中的环境和范围非常重要!但这并不一定意味着你应该使用环境作为数据结构。@Harlan:我完全同意。也许我应该在这方面更加有力@约翰:除非你(1)了解环境并且(2)有充分的理由这样做,否则不要使用环境。列表通常是更好的选择。在我看来,这是避免副作用的最佳实践,除非你绝对不能!谢谢你的回答Shane,我注意到它还没有被接受,所以我认为这意味着我可以大胆地要求更多?我有一个保存在新环境中的数据集,名为dta.env,所以我使用了ls(dta.env),但它只返回了一个数据标记列表。有没有更深入地探索环境的方法?为了得到一份更全面的清单里面有什么?(不确定这是否完全是一个新问题)如果ls()还有更多内容,请详细说明?无论如何,谢谢。这可能很棘手,而且肯定超出了“标准”R用户所需的范围(
    install.packages
    +导入数据+对
    data.frame
    s运行统计测试)。但对于繁重的任务,我有时会认为
    new.env
    类似于创建指针。如果我想模拟一个C
    struct
    ,那么我会使用一系列嵌套的
    new.env
    ,您也可以使用环境。(一个据说缺失的特征,如蟒蛇学家有时会抱怨。)
    > 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