>’ rightwards assignment ‘ (从左到右赋值)虽然在语法上不同,但总是调用相同的函数。覆盖一个也会覆盖另一个。知道这一点很少-6ren">
gpt4 book ai didi

r - R 中的 "="和 "<-"赋值运算符有什么区别?

转载 作者:行者123 更新时间:2023-12-04 09:05:48 25 4
gpt4 key购买 nike

赋值运算符有什么区别=<-在R?

我知道运营商略有不同,如本例所示

x <- y <- 5
x = y = 5
x = y <- 5
x <- y = 5
# Error in (x <- y) = 5 : could not find function "<-<-"

但这是唯一的区别吗?

最佳答案

What are the differences between the assignment operators = and <- in R?


如您的示例所示, =<-运算符优先级略有不同(这决定了它们在同一表达式中混合时的计算顺序)。事实上, ?Syntax 在 R 中给出了以下运算符优先级表,从高到低:

‘-> ->>’ rightwards assignment
‘<- <<-’ assignment (right to left)
‘=’ assignment (right to left)


但这是唯一的区别吗?
由于您是在询问赋值运算符:是的,这是唯一的区别。然而,如果你不相信,你会被原谅。甚至 ?assignOps 的 R 文档声称存在更多差异:

The operator <- can be used anywhere,whereas the operator = is only allowed at the top level (e.g.,in the complete expression typed at the command prompt) or as oneof the subexpressions in a braced list of expressions.


我们不要说得太细: R 文档是错误的 .这很容易证明:我们只需要找到 = 的反例即可。不是 (a) 顶层的运算符,也不是 (b) 括号表达式列表中的子表达式(即 {…; …} )。 - 无需再费周折:
x
# Error: object 'x' not found
sum((x = 1), 2)
# [1] 3
x
# [1] 1
显然,我们已经使用 = 执行了赋值操作, 在上下文 (a) 和 (b) 之外。那么,为什么几十年来核心 R 语言功能的文档是错误的?
这是因为在 R 的语法中,符号 =有两个不同的含义,它们经常被混淆(即使是专家,包括在上面引用的文档中):
  • 第一个意思是作为 赋值运算符 .到目前为止,这就是我们所谈论的全部内容。
  • 第二个含义不是运算符而是 语法标记 表示在函数调用中传递命名参数。不像=运算符它在运行时不执行任何操作,它只是改变解析表达式的方式。

  • 那么 R 如何决定给定的用法是否为 =是指操作符还是命名参数传递?让我们来看看。
    在任何一般形式的代码中......
    ‹function_name›(‹argname› = ‹value›, …)
    ‹function_name›(‹args›, ‹argname› = ‹value›, …)
    ... = 是定义命名参数传递的标记:它不是赋值运算符。此外, =在某些语法上下文中是完全禁止的:
    if (‹var› = ‹value›) …
    while (‹var› = ‹value›) …
    for (‹var› = ‹value› in ‹value2›) …
    for (‹var1› in ‹var2› = ‹value›) …
    其中任何一个都会引发错误“在‹bla›中出现意外的'='”。
    在任何其他上下文中, =指的是赋值运算符调用。特别是,仅在子表达式周围加上括号就可以使上述 (a) 和 (b) 赋值中的任何一个有效。例如,以下执行赋值:
    median((x = 1 : 10))
    但是也:
    if (! (nf = length(from))) return()
    现在你可能会反对这样的代码是残暴的(你可能是对的)。但是我从 base::file.copy 中获取了此代码函数(用 <- 替换 =)——这是大部分核心 R 代码库中的普遍模式。
    original explanation by John Chambers ,R 文档可能基于的,实际上正确地解释了这一点:

    [= assignment is] allowed in only two places in the grammar: at the top level (as a complete program or user-typed expression); and when isolated from surrounding logical structure, by braces or an extra pair of parentheses.



    总之,默认情况下,运算符 <-=做同样的事。但是它们中的任何一个都可以单独覆盖以改变其行为。相比之下, <--> (从左到右赋值)虽然在语法上不同,但总是调用相同的函数。覆盖一个也会覆盖另一个。知道这一点很少实用 but it can be used for some fun shenanigans .

    关于r - R 中的 "="和 "<-"赋值运算符有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1741820/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com