7

手册指出:

运算符“<-”可以在任何地方使用,而运算符“=”只允许在顶层使用(例如,在命令提示符下键入的完整表达式中)或作为表达式括号列表中的子表达式之一.

这里的问题提到了在函数调用中使用时的区别。但在函数定义中,它似乎工作正常:

a = function () 
{
    b = 2
    x <- 3
    y <<- 4
}

a()
# (b and x are undefined here)

那么为什么手册提到这一点the operator ‘=’ is only allowed at the top level

语言定义中没有任何内容(没有=列出任何运算符,真可惜!)

4

3 回答 3

12

你引用的文字说at the top level OR in a braced list of subexpressions。您在子表达式的花括号列表中使用它。这是允许的。

您必须竭尽全力才能找到既不是顶级也不是大括号内的表达式。这是一个。有时您想将赋值包装在 try 块中:try( x <- f() )很好,但try( x = f(x) )不是——您需要更改赋值运算符或添加大括号。

于 2012-06-08T14:38:25.417 回答
7

不在顶层的表达式包括在控制结构中的用法,例如if. 例如,以下编程错误是非法的。

> if(x = 0) 1 else x
Error: syntax error

如此处所述:https ://stackoverflow.com/a/4831793/210673

另请参阅http://developer.r-project.org/equalAssign.html

于 2012-06-08T13:34:36.543 回答
3

除了一些例子(例如其他例子system.time显示的地方<-=结果不同)之外,主要区别是更具哲学性。Perl 的创建者 Larry Wall 说过“相似的东西应该看起来相似,不同的东西应该看起来不同”这样的话,我发现在不同的语言中看看哪些东西被认为是“相似的”以及哪些被认为是很有趣的不同的”。现在对于 R 分配,让我们比较 2 个命令:

myfun( a <- 1:10 )

myfun( a = 1:10 )

有些人会争辩说,在这两种情况下,我们都分配1:10a所以我们正在做的事情是相似的。

另一个论点是,在第一次调用中,我们分配给与被调用a的环境相同的变量,myfun而在第二次调用中,我们分配给在调用a函数时创建的环境中的变量,并且是函数的局部变量,这两个a变量是不同的。

所以使用哪个取决于你认为分配是“相似的”还是“不同的”。

就个人而言,我更喜欢<-,但我认为不值得打一场圣战。

于 2012-06-08T19:25:30.170 回答