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

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

正如这个例子所显示的,我知道操作员略有不同

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

但这是唯一的区别吗?


使用它们在函数调用中设置参数值时,赋值运算符的差异更加明显。 例如:

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在用户工作区中声明,因此可以在函数调用完成后使用它。


R社区普遍偏好使用<-用于赋值(除了函数签名之外)以与(非常)旧版本的S-Plus兼容。 请注意,这些空间有助于澄清类似情况

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

大多数R IDE都有键盘快捷键来使<-更易于输入。 在emacs + ESS中,Ctrl + =在Architect中,Alt + - 在RStudio中(Option + - 在macOS下),Shift + - (下划线)。


如果您更愿意将=写入<-但希望对公开发布的代码(例如,在CRAN上)使用更常见的赋值符号,则可以使用tidy_* formatR程序包中的formatR tidy_*函数自动将<- =替换= <-

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

“为什么x <- y = 5抛出错误但不是x <- y <- 5 ?”这个问题的答案 是“这是解析器中包含的魔法”。 R的语法包含许多不明确的情况,必须以某种方式解决。 解析器根据是否使用=<-来选择以不同顺序解析表达式的位。

要了解正在发生的事情,您需要知道该分配以静默方式返回已分配的值。 您可以通过明确的打印更清楚地看到,例如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帮助页面上所示。


Google的R风格指南通过禁止分配“=”来简化问题。 不错的选择。

https://google.github.io/styleguide/Rguide.xml

R手册详细介绍了所有5个赋值操作符。

http://stat.ethz.ch/R-manual/R-patched/library/base/html/assignOps.html


根据约翰钱伯斯,运营商=只允许在“顶层”,这意味着它是不允许在控制结构, if ,使以下编程错误非法。

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

正如他所写的,“禁止在控制表达式中使用新的赋值形式[=]可以避免编程错误(例如上面的例子),对于相同的运算符而言,可能比其他S赋值更可能发生。”

如果它“与周围的逻辑结构,大括号或一对额外的括号隔离开来”,那么可以设法做到这一点,所以if ((x = 0)) 1 else x将起作用。

请参阅http://developer.r-project.org/equalAssign.html

链接地址: http://www.djcxy.com/p/2029.html

上一篇: What are the differences between "=" and "<

下一篇: Access restriction on class due to restriction on required library rt.jar?