来回双箭头符号 双向箭头符号图片( 二 )

<-)的功能相同 , 作用域也相同 , 因为等号(=)赋值是在全局环境中进行的 , 而代码第三行中的等号(=)则是调用函数时规定命名参数 , 这就是通常情况下 , 我们直接将y~x这个公式直接传递给lm函数的第一个参数 , 也就是formula参数的用法 。如果此时我们将等号(=)替换成箭头(<-) , 则会在全局环境中定义出一个新的formula变量 , 然后再将这个变量传递给了lm函数的第一个参数 。如果是我们有意这么做的话 , 就需要保证命名参数的顺序和函数中定义参数的顺序相同 , 否则就会出现错误 , 或者将名称相同的变量传递给了错误的参数(但程序可能正常运行) , 导致结果错误 。下面的例子可以突出了这种差别:

  • > x <- rnorm(100) > y <- 2*x+rnorm(100) > z <- 3*x+rnorm(100) > data <- data.frame(z,x,y) > rm(x, y, z)
  • 此时 , 环境中已经没有x , y , z变量 , 就只有变量data可以用来做z~x+y的线性回归 。标准写法:
  • > lm(formula=z~x+y,data = https://www.baikexueshe.com/s/data) #也可以写成如下形式:> lm(data=https://www.baikexueshe.com/s/data,formula=z~x+y)
  • 当我们将等号(=)替换成箭头(<-)时 , 正确的命名参数传递应该按函数参数顺序来逐个传参:
  • > lm(formula <- z~x+y, data <- data) Call: lm(formula = formula <- z ~ x + y, data = https://www.baikexueshe.com/s/data <- data) Coefficients: (Intercept) x y 0.069869 3.062565 0.007503> formula z ~ x + y
  • 运行也不会出错 , 但是我们会发现函数实际上是调用的lm(formula = formula <- z ~ x + y, data = https://www.baikexueshe.com/s/data <- data) , 这时产生了一个新的变量formula到环境中 , 并且在全局环境中就可以使用(实际上data变量也被更新了) 。
    但是如果我们对lm函数的参数顺序不了解或者由于马虎搞错了参数顺序 , 这个时候就会容易出现错误 。
  • #错误的写法: > lm(data <- data,formula <- z~x+y) Error in as.data.frame.default(data) : cannot coerce class ""formula"" to a data.frame
  • 执行时会报告异常 , 说明data被当作第一个参数formula传递 , 而formula被当作第二个参数data传递 , 而参数类型不匹配因而导致异常 。因此 , 在函数的命名参数传递时 , 尽量不要用箭头(<-) , 因为既会产生副作用(创建新变量) , 也无法利用命名参数传递的功能 。上面的例子是程序提示了错误 , 但是有时候程序并不一定会提示错误 , 就很容易让我们忽视结果实际上是错误的结果 。例如:我们构建矩阵时 , 
  • # 构建一个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 > 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参数 。在实际编写代码时 , 遇到这种情况 , 如果我们不注意 , 就会导致后续所有结果都出错 。


    特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。