2012-06-08 37 views
6

The manual状态:为什么不应该在函数中使用“=”R运算符?

运算符“< - ”可用于任何地方, 而运算符“=”仅被允许在顶部电平(例如, 在命令提示输入的完整表达式)或者作为表达式的支撑列表中的子表达式的一个 。

The question here提到在函数调用中使用的区别。但是在功能定义,它似乎正常工作:那么,为什么手册中提到,the operator ‘=’ is only allowed at the top level

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

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

没有任何关于它的language definition(没有=运营商上市,真可惜!)未在顶层

+0

它在[第10.4.2节中缀和前缀运算符]中的R-lang中提及(http://cran.r-project.org/doc/manuals/R-lang.html#Infix-and-prefix-operators ),但并没有提到比你提到的帮助条目更多的内容。 –

+5

您引用的文字是“在顶级**或**在子表达式的支撑列表中”。你在一个子表达式的支撑列表中使用它。哪个是允许的。 – Andrie

+5

你必须竭尽全力去寻找既不是顶层也不在大括号内的表达式。这是一个。你有时想把一个赋值包装在try块中:try(x < - f())'很好,但是try(x = f(x))不是 - 你需要改变赋值运算符或添加大括号。 –

回答

12

你引用的文字,说at the top level OR in a braced list of subexpressions。你在一个子表达式的支撑列表中使用它。哪个是允许的。

你必须竭尽全力去寻找既不是顶层也不在括号内的表达式。这是一个。你有时想在一个try块中包装一个赋值:try(x <- f())没问题,但try(x = f(x))不是 - 你需要改变赋值运算符或者添加大括号。

+0

Vincent,谢谢,但是这个答案是怎么回事我的例子中有关'b = 2'错误的问题?也许我想念一些东西,然后请以更明显的方式解释:) – TMS

+0

@Tomas我添加了我的评论,您发现有帮助。我认为这回答了这个问题。 – Andrie

+0

谢谢安德烈,太棒了! – TMS

3

除了一些例子,如system.time,其他人已经显示<-=有不同的结果,主要区别更具哲理性。 Perl的创造者拉里沃尔说,“类似的东西应该看起来相似,不同的东西看起来不一样”,我发现在不同的语言中有趣的是看到什么被认为是“相似的”,哪些被认为是“不同”。现在对R分配让我们比较两个命令:

myfun(a <- 1:10) 

myfun(a = 1:10) 

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

的另一种说法是,在第一呼叫,我们赋值给一个变量a即从中myfun被调用并且在第二呼叫,我们赋值给一个变量a是在创建的环境相同的环境当函数被调用并且是函数的局部时,这两个变量是不同的。

所以使用哪一个取决于您是否将分配考虑为“相似”或“不同”。

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

相关问题