代码之家  ›  专栏  ›  技术社区  ›  csgillespie Carl Witthoft

R中“=”和“<-”之间有什么区别?

  •  605
  • csgillespie Carl Witthoft  · 技术社区  · 16 年前

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

    我知道操作符略有不同,如本例所示

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

    但这是唯一的区别吗?

    7 回复  |  直到 6 年前
        1
  •  0
  •   Diego    4 年前

    差异 assignment operators 当您在函数调用中使用它们设置参数值时,会更清楚。例如:

    median(x = 1:10)
    x   
    ## Error: object 'x' not found
    

    在这种情况下,, x 在函数的范围内声明,因此它不存在于用户工作区中。

    median(x <- 1:10)
    x    
    ## [1]  1  2  3  4  5  6  7  8  9 10
    

    在这种情况下,, x 在用户工作区中声明,因此您可以在函数调用完成后使用它。


    <- 用于分配(函数内签名除外),以与(非常)旧版本的S-Plus兼容。请注意,空格有助于澄清以下情况:

    x<-3
    # Does this mean assignment?
    x <- 3
    # Or less than?
    x < -3
    

    大多数R IDE都有键盘快捷键 < 更容易打字。 Ctrl键 = 在建筑师方面, - 在RStudio( 选项 + - 在macOS的领导下, + - (下划线)在emacs+ESS中。


    如果你喜欢写作 = <- tidy_* formatR 要自动替换的包 具有 <-

    library(formatR)
    tidy_source(text = "x=1:5", arrow = TRUE)
    ## x <- 1:5
    

    问题的答案是“为什么 x <- y = 5 抛出一个错误,但不是 x <- y <- 5 ?“是”这取决于解析器中包含的魔力 many ambiguous cases 必须以某种方式加以解决。解析器根据是否需要以不同的顺序解析表达式的位 = <- 被使用了。

    要了解发生了什么,您需要知道赋值会以静默方式返回已赋值的值。例如,通过显式打印,您可以更清楚地看到这一点 print(x <- 2 + 3) .

    其次,如果我们在赋值时使用前缀符号,则更为清晰。所以

    x <- 5
    `<-`(x, 5)  #same thing
    
    y = 5
    `=`(y, 5)   #also the same thing
    

    解析器解释 x<-y<-5. 作为

    `<-`(x, `<-`(y, 5))
    

    我们可以预料到 x<-y=5 那么

    `<-`(x, `=`(y, 5))
    

    但实际上它被解释为

    `=`(`<-`(x, y), 5)
    

    这是因为 优先级低于 < ,如图所示 ?Syntax 帮助页面。