R中的<-和=赋值符号的细致区别

<-创建的变量的作用范围可以在整个顶层环境,而=仅仅在一个局部环境。

但要<-创建的变量如果是在函数实参传递的时候创建的,其的作用范围可以在整个顶层环境,有一个前提条件:对应的形参在函数内部被用到了。

(一)

一般情况下我觉得使用<-合适,但当给函数参数传值,以及创建对象,对行/列/组件命名的时候用等号

如:

  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<-"payal", x=2,
  2.                y=9, year=1990)

则运行完后,结果看起来一致,但在内存中多了一个name变量,且我们在顶层空间即可访问。

而我们用的

  1. person <-list(name="payal", x=2,
  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]2
  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没执行)

我们的结论是:

<-创建的变量的作用范围可以在整个顶层环境,而=仅仅在一个局部环境。

但要<-创建的变量如果是在函数实参传递的时候创建的,其的作用范围可以在整个顶层环境,有一个前提条件:对应的形参在函数内部被用到了。

来自为知笔记(Wiz)

时间: 2024-10-08 05:10:11

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

闲谈 Android 中的 @ 和 ?符号的引用区别

在 Android 项目开发中,我们经常会用 "@" 或者 "?" 符号去引用系统或者我们应用内添加的资源,这两种符号的引用有什么区别呢,"?attr/" 与 "?android:attr/" 之间又有怎样的不同呢?本文我们不妨闲聊一下. "@" 与 "?" 符号的引用在使用时都有一个规范的格式:"@[+][package:]type:name","?[pa

shell中常用的特殊符号

在shell中常用的特殊符号罗列如下: # ; ;; . , / \ 'string'| ! $ ${} $? $$ $* "string"* ** ? : ^ $# [email protected] `command`{} [] [[]] () (()) || && {xx,yy,zz,...}~ ~+ ~- & \<...\> + - %= == != # 井号 (comments) 注释字符 该句不会被执行 ~ 帐户的 home 目录 用户的

R中=、&lt;-、-&gt;、&lt;&lt;-的区别

1.=和<-assigment的变量的作用域不同: R里通常用符号”<-”代替其它语言里的”=”来作赋值符号.因为前者敲起来比等号要麻烦,且大部分情况下两者是等价的,所以通常就愉懒依旧用”=”来赋值.但要切记两者在某些时候是有区别的.字面上的解释,可以认为”<-”是赋值,”=”是传值.在函数调用中,func(x=1)与func(x<-1)是有区别的,前者调用完后变量x不会被保留,而后者会在工作区里保留变量x=1.再如length(x=seq(1,10))计算完成后x不会被保留,而l

R中数据结构

进行任何数据分析的第一步:创建包含研究信息的数据集. 在R中这个步骤包括以下两步: 1. 选择一种数据结构来存储数据: 2. 将数据输入或导入到这个数据结构中. 一. 数据集 数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量. 下图是一个假想的病例数据集: R中的数据结构包括:标量.向量.矩阵.数组.数据框和列表. 上图实际为R中的一个数据框. R可以处理的数据类型包括:数值类型.字符型.逻辑性(TRUE/FALSE).复数型(虚数)和原生型(字节). 上图中 前三列为数值型变量.后

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

本文对应<R语言编程艺术>第2章:向量:第3章:矩阵和数组:第4章:列表:第5章:数据框:第6章:因子和表 ========================================================================= R语言最基本的数据类型就是向量(vector),单个数值和矩阵都是向量的一种特例. 声明:R中不需要声明变量,但是注意函数式语言的特性,如果读写向量中的元素时,R事先不知道对象是向量的话,则函数没有执行的对象.如下代码是无法工作的: y[1]

R语言笔记 R中设置图形参数--函数par()详解

R有着非常强大的绘图功能,我们可以利用简单的几行代码绘制出各种图形来,但是有时候默认的图形设置没法满足我们的需要,甚至会碰到各种各样的小问题:如坐标轴或者标题出界了,或者图例说明的大小或者位置遮挡住了图形,甚至有时候默认的颜色也不能满足我们的需求.如何进行调整呢?这就用到了"强大"的函数par().我们可以通过设定函数par()的各个参数来调整我们的图形,这篇博文就是对函数par()的各个参数进行一下总结. 函数par()的使用格式如下: par(..., no.readonly =

Java关于String类的赋值符号一些验证

我们都知道,很多Java书中说String对象的内容不能修改,但在实际情况中赋值符号还是可以用在已创建的String类对象中,如下面的代码所示: 1 String s1 = "abs"; 2 String s2 = "abs"; 3 System.out.println("before change:"); 4 System.out.println("s1 is "+s1); 5 System.out.println(&quo

R中逻辑运算

一.是否相等的判断的方法 (1)判断字符串是否相等is.null(x) (2)判断x的每个元素是否在y中出现: x %in% y (3)判断判断每个相对应的元素是否相等: x == y (4)判断近似相等:all.equal(x,y)含有一个哦按点近似相等的参数,近似的参数还有identical(x,y) 二.R语言逻辑运算: 基本运算符号是 <,<=,>,>=; 判断严格相等:== 判断不等的  :!= 短逻辑比较符,将会比较全部元素,返回逻辑向量中每个对比结果,拼接成一个新向量

Oracle中的PLsql的符号解释大全

一.字符tb集 在PL/SQL程序中,允许出现的字符集包括: 大小写字母(A-Z和a-z) 数字(0-9) 符号( ) + - * / < > = ! ~ ^ ; : . ’ @ % , " # $ & _ | { } ? [ ] 制表符.空格和回车符 PL/SQL对大小写不敏感,所以,除了在字符串和字符中,小写字母和它对应的大写字母是等价的. 二.词法单元 PL/SQL包含很多词法单元(lexical unit),大致可以分为以下几类: 分隔符(简单符号和复合符号) 标识符