在我刚学R语言的时候,我就特别纳闷,为啥除了可以用=
定义变量外,还有一个<-
,为啥不统一呢?
首先,我们得说说为啥会有<-
,这个赋值运算符的起源可以追溯到早期的统计编程语言 S 语言,S 语言由贝尔实验室的 John Chambers 和他的同事们开发。这个符号的设计旨在提供一种直观的赋值方式。使用 <-
可以让代码更具可读性,清楚地表达出变量的赋值过程。箭头的方向性象征着数据的流动,从右侧的值流向左侧的变量。也因此,还有一个->
表示从左侧的值流向右侧的变量.
其次,之所以R语言会有这个符号,是因为R 语言是 S 语言的一个扩展和实现,继承了这个符号。这样子原来用S语言的用户,就可以快速切换到R语言中。
此外,在我最早看到的一些资料中,R语言社区推荐 <-
,因为这被认为更符合 R 的编程风格,所以,我目前在函数外基本都用<-
进行赋值操作。
除了相同点,都可以用于赋值外,两者还是有不少区别的。
第一点,我们需要注意<-
的优先级高于 =
,大家运行下代码,感受下区别
rm(list=ls())
x = y <- 5
print(x)
print(y)
rm(list=ls())
x <- y = 5
print(x)
print(y)
对于x = y <- 5
, 实际上是,y=5, 然后x=y, 那么x和y都是5. 而x <- y = 5
则是先 x=y, 由于y没有赋值,所以会报错,直接终止,不会有y=5这一步。
第二点,<-
在函数中也是赋值的意思,同样的,大家运行下代码,感受下区别
# 判断R语言中,如下情况,结果分别是什么
# 情况1
rm(list=ls())
mean(x <- c(1,2,3,4,5))
print(x)
# 情况2
rm(list=ls())
mean(x = c(1,2,3,4,5))
print(x)
# 情况3
rm(list=ls())
mean(y <- c(1,2,3,4,5))
print(y)
# 情况4
rm(list=ls())
mean(y = c(1,2,3,4,5))
print(y)
大家可以复制上面的内容,问问ChatGPT, Claude,Kimi,Deepseek,看看哪个能给出正确答案。
让我们逐个分析这些情况:
情况1: mean(x <- c(1,2,3,4,5))
x <- c(1,2,3,4,5)
是赋值操作,会创建变量xmean()
会计算均值- 输出结果:mean() 返回 3
print(x)
会输出[1] 1 2 3 4 5
情况2: mean(x = c(1,2,3,4,5))
- 这里的
x =
只是函数参数命名,不会创建变量x mean()
会计算均值- 输出结果:mean() 返回 3
print(x)
会报错:Error: object 'x' not found
情况3: mean(y <- c(1,2,3,4,5))
- 与情况1类似,会创建变量y
mean()
会计算均值- 输出结果:mean() 返回 3
print(y)
会输出[1] 1 2 3 4 5
情况4: mean(y = c(1,2,3,4,5))
- 与情况2类似,只是函数参数命名
mean()
不会计算均值,因为缺少参数x- 输出结果:Error in mean.default(y = c(1, 2, 3, 4, 5)) : 缺少参数"x",也没有缺省值
print(y)
会报错:Error: object 'y' not found