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 的值是不确定的。