为什么" =" R运算符不应该用在函数中?

时间:2012-06-08 13:09:02

标签: r assignment-operator

The manual州:

  

运营商'< - '可以在任何地方使用,        而运营商'='仅允许在顶层(例如,        在命令提示符下键入的完整表达式中)或作为一个表达式        括号表达式中的子表达式。

The question here在函数调用中使用时提到了区别。但在函数定义中,它似乎正常工作:

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

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

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

language definition中没有任何内容(没有列出=运算符,真可惜!)

3 个答案:

答案 0 :(得分:12)

您引用的文字为at the top level OR in a braced list of subexpressions。您在子表达式的支撑列表中使用它。这是允许的。

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

答案 1 :(得分:7)

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

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

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

另见http://developer.r-project.org/equalAssign.html

答案 2 :(得分:3)

system.time之类的一些示例之外,其他示例显示<-=的结果不同,主要区别在于更为语用。 Perl的创造者Larry Wall说“类似的东西应该看起来相似,不同的东西应该看起来不同”,我发现它在不同的语言中很有趣,看看哪些东西被认为是“相似的”,哪些被认为是“不同”。现在对于R赋值,让我们比较两个命令:

myfun( a <- 1:10 )

myfun( a = 1:10 )

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

另一个论点是,在第一个调用中,我们分配给一个变量a,该变量位于调用myfun的同一环境中,而在第二个调用中,我们分配给变量a在函数被调用时创建的环境中,并且是函数的本地函数,并且这两个a变量是不同的。

所以使用哪个取决于你是否认为作业“相似”或“不同”。

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