R语言“<-”和“=”的区别

2020-01-18  本文已影响0人  tianzhanlan

R语言中“<-”用于赋值,“=”用于传参。

1.构建矩阵:

#ncol用“=”时,指定矩阵为3列
>matrix(c(1:12),ncol=3) 
      [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12
#ncol用“<-”时,指定ncol为3,但实际是nrow=ncol<-3,因为该位置默认是参数nrow
>matrix(c(1:12),ncol<-3)
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

我们可以看到,尽管两种方法,都运行成功,且得到了一个矩阵,但是第二个结果是一个错误的结果,此处出错的原因就是,ncol<-3是将3赋值给变量ncol,然后再传递给函数对应位置的参数,而在函数内第二个参数实际上是对应的nrow参数。在实际编写代码时,遇到这种情况,如果我们不注意,就会导致后续所有结果都出错。

2.此外,还需要注意的一点就是,在传参中采用箭头(<-)进行赋值的变量只有在需要使用时才会改变其值。例如:

> a <- 1 
> f <- function(x) return(TRUE)
> f(a <- a + 1)
[1] TRUE
> a
[1] 1

请注意,以上范例里, a 的值并没有改变,也就是a并没有加1,还是原来的a值,这是在函数内部并未用到参数a。这会导致程序里出现一些不可预期的结果并且降低代码可读性,所以不推荐在函数参数里使用箭头(<-)这种赋值方式。在看下面的例子:

 > a <- 1 
> f <- function(x) { if(runif(1)>0.5) {TRUE} else {print(x)}} 
> f(a <- a+1)
[1] TRUE 
> a
[1] 1 
> f(a <- a+1)
[1] TRUE
> f(a <- a+1)
[1] 2
> a  
[1] 2

上述代码中,向函数 f() 传递传递参数 a <- a + 1 后,只有在随机数 runif(1) 小于0.5的时候,a 的值才会改变,即执行+1操作,然后打印a。否则传递TRUE值。因此,因为随机数 runif(1) 的随机性,每次调用函数 f()后 a 的值是不确定的。

上一篇下一篇

猜你喜欢

热点阅读