学习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  

你被R语言的=和<-搞昏了头吗的更多相关文章

  1. R语言:用简单的文本处理方法优化我们的读书体验

    博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html 前言 延续之前的用R语言读琅琊榜小说,继续讲一下利用R语言做一些简单的文本处理.分词的事情.其实 ...

  2. Ubuntu下安装R语言和开发环境

    [简介]R是用于统计分析.绘图的语言和操作环境.R是属于GNU系统的一个自由.免费.源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具. [R语言的安装]官网:https://www.r-pr ...

  3. R语言介绍

    R语言简介 R语言是一种为统计计算和图形显示而设计的语言环境,是贝尔实验室(Bell Laboratories)的Rick Becker.John Chambers和Allan Wilks开发的S语言 ...

  4. R语言书籍的学习路线图

    现在对R感兴趣的人越来越多,很多人都想快速的掌握R语言,然而,由于目前大部分高校都没有开设R语言课程,这就导致很多人不知道如何着手学习R语言. 对于初学R语言的人,最常见的方式是:遇到不会的地方,就跑 ...

  5. 主成分分析(PCA)原理及R语言实现

    原理: 主成分分析 - stanford 主成分分析法 - 智库 主成分分析(Principal Component Analysis)原理 主成分分析及R语言案例 - 文库 主成分分析法的原理应用及 ...

  6. R语言教程规划

    本文发表在博客园, http://www.cnblogs.com/stackworm/ 尽管进展中出现了意想不到的事情,期间中断1个多月,但我仍然会坚持下去. 首先,这份教程适合所有对R语言有兴趣且希 ...

  7. NLP︱词向量经验总结(功能作用、高维可视化、R语言实现、大规模语料、延伸拓展)

    R语言由于效率问题,实现自然语言处理的分析会受到一定的影响,如何提高效率以及提升词向量的精度是在当前软件环境下,比较需要解决的问题. 笔者认为还存在的问题有: 1.如何在R语言环境下,大规模语料提高运 ...

  8. R语言︱关联规则+时间因素=序贯关联规则

    序贯模型=关联规则+时间因素. 了解这个模型可以参考李明老师的<R语言与网站分析 [李明著][机械工业出版社][2014.04][446页]>,第九章,第二节的"序列模型关联分析 ...

  9. R语言︱数据集分组、筛选(plit – apply – combine模式、dplyr、data.table)

    R语言︱数据集分组 大型数据集通常是高度结构化的,结构使得我们可以按不同的方式分组,有时候我们需要关注单个组的数据片断,有时需要聚合不同组内的信息,并相互比较. 一.日期分组 1.关于时间的包都有很多 ...

随机推荐

  1. P1463 [SDOI2005]反素数ant

    题意: 题解: 思维难度不高,考虑到n较大,而反质数个数较少 所以只要算出每个反质数即可 考虑如何计算,可以发现,我们只需枚举计算出约数有x个的最小数,再做一下判断即可 另外约数的个数=(a1+1)( ...

  2. Floyd-傻子也能看懂的弗洛伊德算法(转)

                暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程.          ...

  3. 二分搜索-poj1064

    题目大概意思是:给你N个长度的电缆,需要你编写程序 将它分割成 K 根长度相等的小电缆.而我们的目的就是要求出分割出的 最大长度 可以为多少.此处可以应用二分搜索的知识来实现查找最终长度. 代码实现 ...

  4. JDBC fetch size

    make your java run faster A blog on java performance and optimization. On JDBC, Hibernate, caching, ...

  5. loj#2013. 「SCOI2016」幸运数字 点分治/线性基

    题目链接 loj#2013. 「SCOI2016」幸运数字 题解 和树上路径有管...点分治吧 把询问挂到点上 求出重心后,求出重心到每个点路径上的数的线性基 对于重心为lca的合并寻味,否则标记下传 ...

  6. Sphinx(coreseek)一些记录

    之前用Sphinx(coreseek)几次,相对正常 这次用到,记录些问题 1.coreseek好像没人维护了吗,有点可惜. 2.centOS7 编译和coreseek版本有点问题,需要修改编译文件 ...

  7. python生成指定文件夹目录树

    # -*- coding: utf-8 -*- import sys from pathlib import Path class DirectionTree(object): "" ...

  8. JAVA中验证邮箱是否有效

    String email = form.getEmail(); if(!email.matches("^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\\.[a-zA ...

  9. 利用java8对设计模式的重构

    java8中提供的很多新特性可以用来重构传统设计模式中的写法,下面是一些示例: 一.策略模式 上图是策略模式的类图,假设我们现在要保存订单,OrderService接口定义要做什么,而NoSqlSav ...

  10. POI设置excle单元格样式

    Java利用POI生成Excel强制换行 使用POI创建一个简单的   myXls.xls   文件       常用的包为   org.apache.poi.hssf.usermodel.*;    ...