【问题标题】:The different ways of declaring objects in R [duplicate]在R中声明对象的不同方式[重复]
【发布时间】:2014-05-09 23:22:29
【问题描述】:

我们有

=

有人可以准确解释他们的工作吗?如果还有吗?当我使用

【问题讨论】:

  • 很遗憾,链接的问题/答案没有描述 <<-,所以它不应该被关闭。
  • 这些是赋值运算符,而不是声明运算符/语句。在 R 中,分配给一个不存在的变量确实会导致它被“声明”,但这是一个副作用,而不是主要影响。

标签: r function object global declare


【解决方案1】:

在某种意义上=<- 是等价的,但后者是首选,因为= 也被覆盖以指定默认参数(其中<- 不起作用)。

至于<<-,比较麻烦,不推荐。在 R 中,沿任意代码执行的每一步都将与一堆环境相关联——当前环境、调用当前函数的环境等。运算符<<- 尝试为找到的最近的对象赋值在此环境层次结构中,如果找不到,则在全局环境中分配它。例如,下面是一个基本的加法器。

f <- (function() { x <- 0; function(y) { x <<- x + y; x } })()
f(10) # 10
f(5)  # 15

函数f 有一个环境,该环境有一个父环境x。使用&lt;&lt;-,我们可以访问x,而如果我们有&lt;-,则每次的结果都是y,而不是跟踪总和。这样做的原因是&lt;- 会在本地范围内创建x 的副本,并且它始终是0,因为该值是从父环境复制的。

有关这些错综复杂的更多信息,您还可以查看相关的R documentation

【讨论】:

  • 在某处链接到文档可能会很好:stat.ethz.ch/R-manual/R-devel/library/base/html/assignOps.html
  • 如果我正在运行一个函数,我怎么能说函数中的一个对象现在是新值(函数内部和外部),直到它被分配?
  • 好吧,&lt;- 分配一个本地副本,&lt;&lt;- 分配任何本地副本,所以如果你真的希望在本地和父级中设置它范围,你可以做x &lt;&lt;- blah; x &lt;- blah。你为什么要这样做?
  • 另请参阅 stackoverflow.com/questions/5526322/… 了解为什么 &lt;&lt;- 不好。
  • 你知道吗?我厌倦了对&lt;&lt;- 的这种强迫性恐惧。 R 的核心作者完全意识到它的危险,并且将操作符置于完全意识到其缺点的语言中。如果您正在编写需要“冒泡”对父环境的引用的代码,那么有很多有效的用例。当然,您可以使用assign,但它只是掩盖了完全相同的代码!仅仅因为新手将&lt;&lt;- 误认为全局赋值并不意味着即使是中级 R 开发人员也应该认为它很可怕。
猜你喜欢
  • 2014-09-13
  • 2014-05-25
  • 2013-06-21
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多