<-创建的变量的作用范围可以在整个顶层环境,而=仅仅在一个局部环境。
但要<-创建的变量如果是在函数实参传递的时候创建的,其的作用范围可以在整个顶层环境,有一个前提条件:对应的形参在函数内部被用到了。
 
(一)
一般情况下我觉得使用<-合适,但当给函数参数传值,以及创建对象,对行/列/组件命名的时候用等号
如:
  1. person <-list(name="payal", x=2,
  2.                 y=9, year=1990)
  3. person
  4. $name
  5. [1]"payal"
  6.  
  7. $x
  8. [1]2
  9.  
  10. $y
  11. [1]9
  12.  
  13. $year
  14. [1]1990
否则,如果写成:
  1. person <-list(name,
  2.                y=9, year=1990)
则运行完后,结果看起来一致,但在内存中多了一个name变量,且我们在顶层空间即可访问。
而我们用的
  1. person <-list(name,
  2.                y=9, year=1990)
这些name,y,year就不能直接在顶层访问了,而需要通过$符号。
 
(二)
简单点说,=和<-这两个赋值操作符的区别在于其作用域。
 
What’s the difference?
        The main difference between the two assignment operators is scope(作用范围). It’s easiest to see the difference with an example:
        ##Delete x (if it exists)
        > rm(x)
        > mean(x=1:10) #[1] 5.5
        > x #Error: object 'x' not found
        Here x is declared within the function’s scope of the function, so it doesn’t exist in the user workspace. Now, let’s run the same piece of code with using the <- operator:
 
        > mean(x <- 1:10)# [1] 5.5
        > x # [1] 1 2 3 4 5 6 7 8 9 10
        This time the x variable is declared within the user workspace.
        When does the assignment take place?
 (三)
        In the code above, you may be tempted to thing that we “assign 1:10 to x, then calculate the mean.” This would be true for languages such as C, but it isn’t true in R. Consider the following function:
        > a <- 1
        > f <- function(a) return(TRUE)
        > f <- f(a <- a + 1); a
        [1] TRUE
        [1] 1
 
        Notice that the value of a hasn’t changed! In R, the value of a will only change if we need to evaluate the argument in the function. This can lead to unpredictable behaviour:
        > f <- function(a) if(runif(1)>0.5) TRUE else a
        > f(a <- a+1);a
        [1] 2
        > f(a <- a+1);a
        [1] TRUE
        [1] 2
        > f(a <- a+1);a
        [1] 3
 
(四)
让我仔细的举几个例子吧
让我来告诉你什么时候会用到吧:
  1. 例子1
  2. > a <-1
  3. > f <- function(a)return(TRUE)
  4. > f <- f(a <- a +1);
  5. > a
  6. [1]1
  7. > f
  8. [1] TRUE
a <- a + 1这条语句并没有被执行。
如上面的解释,这是因为,需要的时候,这个语句才会执行。
我们看以下几个例子。
  1. 例子2
  2. > a <-1
  3. > f <- function(a)return(1+2)
  4. > f <- f(a <- a +1);
  5. > a
  6. [1]1
  7. > f
  8. [1]3
  9. > a <-1
  10. > f <- function(a){
  11. +1+10
  12. +return(1+2)
  13. +}
  14. > f <- f(a <- a +1);
  15. > a
  16. [1]1
  17. > f
  18. [1]3
发现,a <- a + 1还是没有被执行
注意,下面这个例子中,a <- a + 1被执行了
  1. 例子3
  2. > a <-1
  3. > f <- function(a){
  4.  
  5. +   print(a)
  6. +   return(1+2)
  7. +}
  8. > f <- f(a <- a +1);
  9. [1]2
  10. > a
  11. [1]
  12. > f
  13. [1]3
为什么这个例子中,a <- a + 1被执行了呢,按照在函数中需要的时候才计算值的的逻辑,就是,我们的函数体中用到了这个形参a,所以对于的实参被计算了。
还有一点,我们为什么说print中打印的是形参a呢?可以看如下代码:
  1. 例子4
  2. > a <-1
  3. > f <- function(x){
  4. +   print(a)
  5. +   return(1+2)
  6. +}
  7. > f <- f(a <- a +1); 
  8. [1]1
  9. > a
  10. [1]1
  11. > f
  12. [1]3
看吧,a <- a + 1还是没执行了呢,所以说,例子3中的形参,本身作为一个局部变量,是会覆盖全局变量中的a的
 
那么下面的代码为什么还是没执行a <- a + 1呢,因为a<-5这一句,是新生成了一个局部变量a。
  1. 例子5
  2. > f <- function(a){
  3. +   a<-5
  4. +   return(1+2)
  5. +}
  6. > f <- f(a <- a +1); 
  7. > a
  8. [1]1
  9. > f
  10. [1]3
 
再来一个强力的佐证,下面的a<-a+5右侧的a就是形参中的a,所以a <- a + 1再一次被执行了
  1. 例子6
  2. > a <-1
  3. > f <- function(a){
  4.  
  5. +   a<-a+5
  6. +   return(1+2)
  7. +}
  8. > f <- f(a <- a +1);
  9. > a
  10. [1]2
  11. > f
  12. [1]3
 
 
(五)
再来验证下,一开始的结论,我们一开始的结论是<-创建的变量的作用范围可以在整个顶层环境,而=仅仅在一个局部环境。
注意,运行下述例子之前,先清空内存中的a。
  1. 例子7
  2. > f <- function(a){
  3.  
  4. +   a<a+6
  5. +   return(1+2)
  6. +}
  7. > f <- f(a <-1:5);
  8. > a
  9. [1]12345
  10. > f
  11. [1]3
这个单独的例子中,我们事先并没有创建a,但是由于a <- 1:5语句执行了,我们发现我们在函数外的环境,仍然能访问到a。
(这是因为a+6用到了形参a,所以a <- 1:5执行了)
 
注意,运行下述例子之前,先清空内存中的a。
  1. 例子8
  2. > f <- function(a){
  3. + a<-6
  4. +return(1+2)
  5. +}
  6. > f <- f(a <-1:5);
  7. > a
  8. Error: object 'a'not found
  9. > f
  10. [1]3
(同理,没用到a,所以a <- 1:5没执行)
 
我们的结论是:
<-创建的变量的作用范围可以在整个顶层环境,而=仅仅在一个局部环境。
但要<-创建的变量如果是在函数实参传递的时候创建的,其的作用范围可以在整个顶层环境,有一个前提条件:对应的形参在函数内部被用到了。
 

R中的<-和=赋值符号的细致区别的更多相关文章

  1. 【Makefile】Makefile中的赋值符号=、:=、?=、+=

    Makefile中主要有四个赋值符号: = 是最基本的赋值:= 是覆盖之前的值?= 是如果没有被赋值过就赋予等号后面的值+= 是添加等号后面的值 1.“=” “=”赋值:make会将整个makefil ...

  2. shell中常用的特殊符号

    在shell中常用的特殊符号罗列如下: # ; ;; . , / \ 'string'| ! $ ${} $? $$ $* "string"* ** ? : ^ $# $@ `co ...

  3. R中的sub替换函数【转】

    R中的grep.grepl.sub.gsub.regexpr.gregexpr等函数都使用正则表达式的规则进行匹配.默认是egrep的规则,也可以选用Perl语言的规则.在这里,我们以R中的sub函数 ...

  4. shell脚本中的一些特殊符号

    在shell中常用的特殊符号罗列如下:  # ;   ;; . , / \\ 'string'| !   $   ${}   $? $$   $*  \"string\"* **  ...

  5. 简单介绍一下R中的几种统计分布及常用模型

    统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 统计分布每一种分布有四个函数:d――density(密度函数) ...

  6. R中逻辑运算

    一.是否相等的判断的方法 (1)判断字符串是否相等is.null(x) (2)判断x的每个元素是否在y中出现: x %in% y (3)判断判断每个相对应的元素是否相等: x == y (4)判断近似 ...

  7. R中基本函数学习[转载]

    转自:https://www.douban.com/note/511740050/ 1.数据管理 numeric:数值型向量 logical:逻辑型向量 character:字符型向量list:列表 ...

  8. R语言编程艺术(2)R中的数据结构

    本文对应<R语言编程艺术>第2章:向量:第3章:矩阵和数组:第4章:列表:第5章:数据框:第6章:因子和表 ======================================== ...

  9. (2)R中的数据类型和数据结构

    R中的数据结构主要面向<线性代数>中的一些概念,如向量.矩阵等.值得注意的是,R中其实没有简单数据(数值型.逻辑型.字符型等),对于简单类型会自动看做长度为1的向量.比如: > b= ...

随机推荐

  1. 烂泥:openvpn tun模式下客户端与内网机器通信

    本文由秀依林枫提供友情赞助,首发于烂泥行天下 前两篇文章我们介绍了有关openvpn的搭建与配置文件的讲解,这篇文章我们再聊介绍下,在tun模式下openvpn客户端如何与内网机器通信的问题. 一.实 ...

  2. ::before和::after伪元素的用法

    一.介绍 css3为了区分伪类和伪元素,伪元素采用双冒号写法. 常见伪类——:hover,:link,:active,:target,:not(),:focus. 常见伪元素——::first-let ...

  3. java设计模式之状态模式

    状态模式 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类. 状态模式UML图 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关 ...

  4. PhotoShop算法原理解析系列 - 像素化---》碎片。

    接着上一篇文章的热度,继续讲讲一些稍微简单的算法吧. 本文来讲讲碎片算法,先贴几个效果图吧:             这是个破坏性的滤镜,拿美女来说事是因为搞图像的人90%是男人,色色的男人. 关于碎 ...

  5. CSS的一些零碎总结

    1.CSS 伪元素用于向某些选择器设置特殊效果(用来当作一个东西的,跟一个元素差不多,但不是元素). ① :frist-line伪元素:用于向文本首行设置特殊样式,但是只能用于块级元素. 以下属性可应 ...

  6. Qt 之 饼图

    Qt 库由许多模块组成,其中的 Qt Charts,包含了一系列图表组件. 1  饼图 (pie chart) 1.1  Charts 模块 .pro 中添加如下语句: QT += charts 头文 ...

  7. AC日记——苹果树 codevs 1228

    1228 苹果树  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 在卡卡的房子外面,有一棵 ...

  8. SQLMAP大全

    转自:http://blog.csdn.net/zsf1235/article/details/50974194 本人小白,初次认识sqlmap,很多都是转载资料,只是学习研究一下! 练习的网站可以用 ...

  9. (原创)JAVA多线程一传统多线程

    一,多线程 多线程是提高程序效率,避免资源浪费的很好的解决方案,下面来慢慢的介绍多线程的一些基本知识,而这些是晋级高级不可或缺的一部分 1,Thread类 类实现多线程需要实现Runnable接口,我 ...

  10. BOM浏览器对象模型

    访问和操作浏览器窗口的模型称为浏览器对象模型BOM(Browser Object Model). BOM整体对象图. 核心是window对象: 以下有特殊双重身份: window对象既是ECMAScr ...