R语言<-和=赋值的区别-实验

R系统版本

version
               _                           
platform       x86_64-pc-linux-gnu         
arch           x86_64                      
os             linux-gnu                   
system         x86_64, linux-gnu           
status                                     
major          4                           
minor          1.1                         
year           2021                        
month          08                          
day            10                          
svn rev        80725                       
language       R                           
version.string R version 4.1.1 (2021-08-10)
nickname       Kick Things                 

已设置的全局变量

ls()

载入pryr库,包含address()函数

library(pryr)

验证 <- 赋值效果

a <- 1
b <- 1
address(a)

‘0x55cc4a3d5948’

address(b)

‘0x55cc4792dfb8’

ls()
  1. 'a'
  2. 'b'
b <- a
address(a)

‘0x55cc4a3d5948’

address(b)

‘0x55cc4a3d5948’

b <- 1
address(a)

‘0x55cc4a3d5948’

address(b)

‘0x55cc49d3b060’

b <- 1
address(a)

‘0x55cc4a3d5948’

address(b)

‘0x55cc490a7f98’

验证=,发现其效果和<-一样

x = 1
y = 1
address(x)

‘0x55cc4a5c86b0’

address(y)

‘0x55cc45bd0358’

ls()
  1. 'a'
  2. 'b'
  3. 'x'
  4. 'y'
y = x
address(x)

‘0x55cc4a5c86b0’

address(y)

‘0x55cc4a5c86b0’

y = 1
address(x)

‘0x55cc4a5c86b0’

address(y)

‘0x55cc493c1d40’

y = 1
address(x)

‘0x55cc4a5c86b0’

address(y)

‘0x55cc48911230’

交叉验证<-=

p <- 1
q = p
address(p)

‘0x55cc4782fdd8’

address(q)

‘0x55cc4782fdd8’

m = 1
n <- m
address(m)

‘0x55cc49f89410’

address(n)

‘0x55cc49f89410’

验证复杂对象是否遵循上述现象

t <- c(1:10)
u <- c(1:100)
address(t)

‘0x55cc4a877e98’

address(u)

‘0x55cc46ed4d10’

u <- t
address(t)

‘0x55cc4a877e98’

address(u)

‘0x55cc4a877e98’

u = t
address(t)

‘0x55cc4a877e98’

address(u)

‘0x55cc4a877e98’

验证使用<-赋值的copy-on-modify

h <- c(1:10)
j <- h
address(h)

‘0x55cc49e3ee38’

address(j)

‘0x55cc49e3ee38’

h[2] <- 5
address(h)

‘0x55cc47fa82f8’

address(j)

‘0x55cc49e3ee38’

h[3] <- 6
address(h)

‘0x55cc47fa82f8’

address(j)

‘0x55cc49e3ee38’

验证使用=赋值的copy-on-modify

k = c(1:100)
l = k
address(k)

‘0x55cc48a24b10’

address(l)

‘0x55cc48a24b10’

k[2] = 50
address(k)

‘0x55cc493eaa80’

address(l)

‘0x55cc48a24b10’

k[3] = 24
address(k)

‘0x55cc493eaa80’

address(l)

‘0x55cc48a24b10’

验证混合使用<-=赋值的copy-on-modify

o = c(1:20)
p = o
address(o)

‘0x55cc48ef0ae8’

address(p)

‘0x55cc48ef0ae8’

o[2] <- 56
address(o)

‘0x55cc45a23950’

address(p)

‘0x55cc48ef0ae8’

o[5] <- 34
address(o)

‘0x55cc45a23950’

address(p)

‘0x55cc48ef0ae8’

验证向量的内存布局

w = c(1:4)
address(w)

‘0x55cc48448918’

address(w[1])
Error: x must be the name of an object
Traceback:


1. address(w[1])

2. address2(check_name(substitute(x)), parent.frame())

3. check_name(substitute(x))

4. stop("x must be the name of an object", call. = FALSE)
e <- w[1]
address(e)

‘0x55cc494a9f08’

e <- w[2]
address(e)

‘0x55cc4a684000’

使用<-=为函数传参的区别

fun <- function(s=11,d=22){
    print(s)
    print(d)
}
fun(d=20,s=10)
[1] 10
[1] 20
s
Error in eval(expr, envir, enclos): object 's' not found
Traceback:
d
Error in eval(expr, envir, enclos): object 'd' not found
Traceback:
fun(d <- 20,s <- 10)
[1] 20
[1] 10
s

10

d

20


总结

  • <-= 在赋值行为上,没有区别,在函数关键字传参上,只能用 =
  • 根据《R编程艺术》,R的变量类似于C语言的指针,其仅存储R对象(包括简单对象和复杂对象)的 地址 ,并且存在叫做 copy on modify 的机制。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值