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()
- 'a'
- '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()
- 'a'
- 'b'
- 'x'
- '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
的机制。