• 你被R语言的=和<-搞昏了头吗


    学习R有一周了,心中一直有一个困惑,关于= 和 <-,今晚决定搞定它!

    迄今为止用到最多的函数是matrix() 和c(),就用他们说起!
     
    之前学了四五门语言,对于=赋值已经成了惯性,下面是我的习惯写法:
    matrix(1:6,nrow = 2,ncol = 3,byrow = FALSE)  #有时候写成 byrow = F ,但发现错了,缩写的FALSE导致这个参数设置无效。
    可实际上还有另外一种用<-的才是书中常用的写法:
    matrix(1:6,nrow <- 2,ncol <- 3,byrow <- FALSE)
     
    Rstudio里面F1得到帮助文档是这样的:
    matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
     
    因此本文的目标在于总结这两种用法的区别和注意的地方。
     
    上代码:
     
    # 函数要求参数类型-----更特殊的情况, 
    #函数定义:system.time(expr, gcFirst = TRUE)
     
    system.time(x = 100)   #问题一:执行失败,为什么?
    ## Error: 参数((x = 100)) 没有用
     
    system.time(x <- 100)  #执行成功
    ##    user  system elapsed 
    ##       0       0       0
     
    解答1: 
    1.  <-箭头是表达式,而=等号仅为赋值语句而非表达式。
    2. 作为函数参数使用时,使用<-箭头表达式的话,会自动在用户空间栈创建相应的变量,而=等号则没有此项动作。
    3.<-箭头用作为函数设置参数使用时,由于其表达式(exp)的特性,实际上是有两步动作,
         1.执行表达式
          2.将结果当做匿名参数传递给函数。注意是匿名参数,接下来的例子还要讲到。
     
     
    matrix(1:6, 3, TRUE)  #问题2:本意是,给出3,他应该知道自己除以下得到列数,结果却与预期不符, 少了1列,为什么
    ##      [,1]
    ## [1,]    1
    ## [2,]    2
    ## [3,]    3
     
    matrix(1:6, 3, 2, TRUE)
    ##      [,1] [,2]
    ## [1,]    1    2
    ## [2,]    3    4
    ## [3,]    5    6
     
    解答2:
    1.解释器按照matrix函数定义的顺序index,对参数进行解释分析。
    2.解释器对于 匿名参数会自动将TRUE 转换成 1, 将False转换成 0 
     
    # 不照函数定义的参数顺序来设置 nrow 和 ncol 属性。
    matrix(1:6, byrow = FALSE, 3)  #问题3:参数不按定义也行的通,为什么?
    ##      [,1] [,2]
    ## [1,]    1    4
    ## [2,]    2    5
    ## [3,]    3    6
     
    matrix(1:6, byrow <- FALSE, 2) #错误,参见问题2
     
    matrix(1:6, byrow = FALSE, 2) #不按照参数顺序,给出nrow = 2,自动得到3列
    ##      [,1] [,2] [,3]
    ## [1,]    1    3    5
    ## [2,]    2    4    6
     
    matrix(1:6, byrow <- TRUE, 2)   #只得到一行,原因见 问题2.
     
    解答3:
    1.当使用=时,命名参数提前,但是解释器将会忽略其index,因此,解释依然正确。 
    2.当使用<-时,相当于是匿名参数。
     
     
     
    #使用<-,并打乱参数的位置,无名参数将会自动排除之前的命名参数
    matrix(1:6, ncol <- 2, nrow <- 3, byrow = TRUE)  #问题4:设置col为2,结果却为3,为什么?
    ##      [,1] [,2] [,3]
    ## [1,]    1    2    3
    ## [2,]    4    5    6
     
    matrix(1:6, ncol <- 3, nrow <- 2, byrow = TRUE)  #设置col为3,结果输出却为2,为什么?
    ##      [,1] [,2]
    ## [1,]    1    2
    ## [2,]    3    4
    ## [3,]    5    6
     
    解答4:
    使用<- 相当于是匿名参数,不过在当前用户空间多了一个新的变量而已。
     
    # 这还不够,下面继续!
    matrix(1:6, ncol = 2, nrow = 3, byrow = TRUE)  #问题5:参数逆序也可以,结果与预期一致,3是3,2归2,没错。,但为什么?
    ##      [,1] [,2]
    ## [1,]    1    2
    ## [2,]    3    4
    ## [3,]    5    6
     
    matrix(1:6, ncol = 3, nrow = 2, byrow = TRUE)  #与预期一致。
    ##      [,1] [,2] [,3]
    ## [1,]    1    2    3
    ## [2,]    4    5    6
    解答5: 命名参数可以不按照函数参数顺序排列,随意。
     
    # 问题6:下面代码的区别是什么?(<-的孤立点问题)
    # code seg 1
    x = 1
    fun = function(x) return(TRUE)
     
    fun(x = x + 1);x 
    ## [1] TRUE
    ## [1] 1       #x的值未改变
     
    fun(x <- x + 2);x
    ## [1] TRUE
    ## [1] 1
     
    # code seg 2
    x = 1
    fun = function(x) {
        x
        return(TRUE)
    }
    fun(x = x + 1);x
    ## [1] TRUE
    ## [1] 1                    #依然未改变
    fun(x <- x + 2);x
    ## [1] TRUE
    ## [1] 3                    #变成3
     
    解答6:
    这是R 变态的地方,也是它主动优化的结果,当函数定义被解释器分析时,若发现参数未被函数体内任何代码引用,则此参量不会被真正地传递执行。即使其使用<-箭头表达式。
     
     
     
    #再总结:
    <- 和 = 的区别在于当参数使用时,参数存在匿名参数、命名参数两大类。
     
    1.当使用=时,命名参数提前,但是解释器将会忽略其index,因此,解释依然正确。 
    2.当使用<-时,相当于是匿名参数。不过在当前用户空间多了一个新的变量而已。
     
    3.  <-箭头是表达式,而=等号仅为赋值语句而非表达式。
    4. 作为函数参数使用时,使用<-箭头表达式的话,会自动在用户空间栈创建相应的变量,而=等号则没有此项动作。
    5.<-箭头用作为函数设置参数使用时,由于其表达式(exp)的特性,实际上是有两步动作,
          1.执行表达式
          2.将表达式的结果当做匿名参数传递给函数。
     
    6.当传递的参数都为匿名参数时,解释器按照matrix函数定义的顺序index,对参数进行解释分析,并不会对变量类型进行检测后对号入座,
    如果可以,它倒是会自动转换类型以适应目标位置的类型。如:使用False 和 true时,碰到类型不匹配的地方,解释器会自动将TRUE 转换成 1, 将False转换成 0 
     
    7:命名参数可以不按照函数参数顺序排列,可随意。
     
    8:这是R 变态的地方,也是它主动优化的结果,当函数定义被解释器分析时,若发现参数未被函数体内任何代码引用,则此参量不会被真正地传递执行。即使其使用<-箭头表达式。
     
     
    reference:
    1.http://bbs.pinggu.org/thread-1247151-1-1.html
    2.http://yihui.name/cn/2012/09/equal-and-arrow/
    3.http://f.dataguru.cn/forum.php?m ... 824&page=2#pid87934    
    4.http://cran.r-project.org/doc/manuals/R-lang.html#Argument-matching  
  • 相关阅读:
    【BZOJ 2124】【CodeVS 1283】等差子序列
    【BZOJ 1036】【ZJOI 2008】树的统计Count
    【BZOJ 1901】【ZJU 2112】Dynamic Rankings
    【BZOJ 3924】【ZJOI 2015】幻想乡战略游戏
    【BZOJ 4103】【THUSC 2015】异或运算
    【BZOJ 4513】【SDOI 2016】储能表
    【HDU 3622】Bomb Game
    【BZOJ 3166】【HEOI 2013】Alo
    【BZOJ 3530】【SDOI 2014】数数
    【BZOJ 4567】【SCOI 2016】背单词
  • 原文地址:https://www.cnblogs.com/ToDoToTry/p/4311051.html
Copyright © 2020-2023  润新知