当列表本身不改变地址时,lobstr::obj_addr 会出现奇怪的行为,这是由于其对列表进行矢量化所致
我刚刚开始学习 Wickham 的《高级 R》(第二版),并完成了 2.2.2 练习的第一个练习。我认为,鉴于:
a <- 1:10; b <- a; c <- b
它们都将具有与lobstr::obj_addr
函数检索到的相同的内存地址。如果我们仅使用 a、b 或 c 作为输入,情况确实如此,但由于我很懒,想一次获得所有值,所以我这样做了:
list(a, b, c) |> lapply(obj_addr) # lapply or sapply
然后,每次运行该函数时,我们都会在不同的名称中获得一组不同的值。如果我们x <- list(a, b, c)
在调用函数之前通过lapply
、 和进行设置,这种情况仍然会发生obj_addr(x[[1]]) == obj_addr(x[[2]]) == obj_addr(x[[3]]) == obj_addr(a)
,因此这不是每次都创建新列表的问题。有人知道这是怎么回事吗?我理解,在某个点上,每次调用都会生成一个具有自己内存地址的新输出对象,但我不知道如何lapply
干扰给定对象的常量函数,例如obj_addr
。
先感谢您!