zoukankan      html  css  js  c++  java
  • 你被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  
  • 相关阅读:
    Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理
    mysql 索引
    C++ 后台进程 daemon
    Linux进程状态
    实现一个简单的shared_ptr
    [LeetCode] Factorial Trailing Zeroes
    完美转发
    排序
    每天五个java相关面试题(7)--线程篇
    程序员为什么会淡忘?
  • 原文地址:https://www.cnblogs.com/ToDoToTry/p/4311051.html
Copyright © 2011-2022 走看看