由买买提看人间百态

topics

全部话题 - 话题: tracemem
(共0页)
d*******o
发帖数: 493
1
来自主题: Statistics版 - 其实R有的方面也很BT
一直有个R问题没弄明白,想请问songkun还有其它大虾一下: 为什么整数的vector
copy-on-change 要弄两个copy?中间过度的哪个copy是干什么的?
> # Floating
> rm(list = ls())
> a <- runif(1:100)
> tracemem(a)
[1] "<0x026028e0>"
> b <- a
> b[1] <- 1
tracemem[0x026028e0 -> 0x02535490]:
>
> # Integer
> rm(list = ls())
> a <- 1:100
> tracemem(a)
[1] "<0x027dafe8>"
> b <- a
> b[1] <- 1
tracemem[0x027dafe8 -> 0x02788728]:
tracemem[0x02788728 -> 0x025b39e0]:

值(
s*****n
发帖数: 2174
2
来自主题: Statistics版 - 其实R有的方面也很BT
问了一个公司的大牛同事, 终于搞明白怎么回事了.
a <- 1:100 # class(a) is integer
tracemem(a)
b <- a
b[1] <- 1 # 注意1是numeric双精度, 不是integer
出现的两行转换, 第一次是将b复制一次, 第2次是转换成双精度, 然后才赋值.
看下面的例子, 如果直接赋值integer,就没有这个问题.
a <- 1:100
tracemem(a)
b <- a
b[1] <- 1L
有趣的是下面这个例子, 把一个integer赋值进双精度的vector, 只生成一次转换
a <- c(1,2,3) # a是numeric
tracemem(a)
b <- a
b[1] <- 1L # 只生成一次copy.
也就是说, 将numeric scalar赋值进一个integer的向量, R会首先把vector转换成双精
度, 然后再赋值. 但是把integer scalar赋值进一个numeric向量, R会把scalar先转换
成双精度, 然后赋值进去.
(共0页)