运营商'< - '可以在任何地方使用, 而运营商'='仅允许在顶层(例如, 在命令提示符下键入的完整表达式中)或作为一个表达式 括号表达式中的子表达式。
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中没有任何内容(没有列出=
运算符,真可惜!)
答案 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
答案 2 :(得分:3)
除system.time
之类的一些示例之外,其他示例显示<-
和=
的结果不同,主要区别在于更为语用。 Perl的创造者Larry Wall说“类似的东西应该看起来相似,不同的东西应该看起来不同”,我发现它在不同的语言中很有趣,看看哪些东西被认为是“相似的”,哪些被认为是“不同”。现在对于R赋值,让我们比较两个命令:
myfun( a <- 1:10 )
myfun( a = 1:10 )
有人会争辩说,在这两种情况下,我们都会将1:10
分配给a
,所以我们所做的是类似的。
另一个论点是,在第一个调用中,我们分配给一个变量a
,该变量位于调用myfun
的同一环境中,而在第二个调用中,我们分配给变量a
在函数被调用时创建的环境中,并且是函数的本地函数,并且这两个a
变量是不同的。
所以使用哪个取决于你是否认为作业“相似”或“不同”。
就个人而言,我更喜欢<-
,但我认为值得打一场圣战并不值得。