R中的赋值运算符:“=”和“< – ”
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兼容,使用' <- '
作为赋值(除了函数签名之外)是一个普遍的select。 请注意,这些空间有助于澄清情况
x<-3 # Does this mean assignment? x <- 3 # Or less than? x < -3
大多数R IDE都有键盘快捷键,使' <- '
更易于input。 在emacs + ESS中, Ctrl + =在Architect中, Alt + -在RStudio中, Shift + - (下划线)。
如果您更喜欢writing =
to <-
但是希望为公共发布的代码(例如在CRAN上)使用更常见的赋值符号,则可以使用formatR
包中的formatR
tidy_*
函数自动replace=
<-
。
library(formatR) tidy_source(text = "x = 1:5", arrow = TRUE) ## x <- 1:5
“为什么x <- y = 5
抛出一个错误但不是x <- y <- 5
? 是“这是parsing器中包含的魔法”。 R的语法包含许多不明确的情况 ,必须以某种方式解决。 parsing器根据是否使用=
或<-
来select以不同顺序parsingexpression式的位。
要了解正在发生的事情,您需要知道该分配以静默方式返回已分配的值。 您可以通过明确的打印更清楚地看到,例如print(x <- 2 + 3)
。
其次,如果我们使用前缀符号进行赋值,则更为清楚。 所以
x <- 5 `<-`(x, 5) #same thing y = 5 `=`(y, 5) #also the same thing
parsing器将x <- y <- 5
为
`<-`(x, `<-`(y, 5))
我们可以预期x <- y = 5
会是
`<-`(x, `=`(y, 5))
但实际上它被解释为
`=`(`<-`(x, y), 5)
我不确定为什么会发生这种情况,因为=
的优先级高于<-
。 也许是parsing器中的一个错误,但试图让现在改变的好运气。
文档是错误的 。 =
实际上比<-
低,这就是为什么顺序意外不同。
现在, ?Syntax
帮助页面正确显示=
优先级低于<-
。
Google的R风格指南通过禁止分配“=”来简化问题。 不错的select。
https://google.github.io/styleguide/Rguide.xml
R手册详细介绍了所有5个赋值操作符。
http://stat.ethz.ch/R-manual/R-patched/library/base/html/assignOps.html
根据约翰·钱伯斯(John Chambers)的说法,运营商=
只允许在“最高层”,这意味着它不允许在控制结构中, if
使得下面的编程错误是非法的。
> if(x = 0) 1 else x Error: syntax error
正如他所写的,“禁止在控制expression式中使用新的赋值forms[=]可以避免编程错误(比如上面的例子),这对于等号运算符比其他S赋值更有可能。
你可以设法做到这一点,如果它是“与周围的逻辑结构,大括号或一对额外的括号隔离”,所以if ((x = 0)) 1 else x
将起作用。
x = y = 5
相当于x = (y = 5)
,因为赋值运算符“group”从右到左,哪个起作用。
含义:将5赋给y,留下数字5; 然后将这5分配给x。
这不是一样的(x = y) = 5
,这是行不通的!
含义:将y的值赋给x,保留y的值; 然后分配5,嗯,究竟是什么?
当你混合不同种类的赋值运算符时, <-
绑定比=
更紧密
所以x = y <- 5
被解释为x = (y <- 5)
,这是有道理的。
不幸的是, x <- y = 5
被解释为(x <- y) = 5
,这是行不通的!
有关优先(绑定)和分组规则,请参阅?Syntax
和?assignOps
。
运算符< – 和=分配到它们被评估的环境中。 运算符< – 可以在任何地方使用, 而运算符=只允许在顶层 (例如,在命令提示符下键入的完整expression式)或者作为expression式的加载列表中的一个子expression式。
这也可能增加了解这两个运营商之间的差异:
df <- data.frame( a = rnorm(10), b <- rnorm(10) )
对于第一个元素R分配了值和专有名称,而第二个元素的名字看起来有点奇怪。
str(df) # 'data.frame': 10 obs. of 2 variables: # $ a : num 0.6393 1.125 -1.2514 0.0729 -1.3292 ... # $ b....rnorm.10.: num 0.2485 0.0391 -1.6532 -0.3366 1.1951 ...
R版本3.3.2(2016-10-31); macOS Sierra 10.12.1