在R语言中<-和=有什么不同

在我刚学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) 是赋值操作,会创建变量x
  • mean() 会计算均值
  • 输出结果: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

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×