gpt4 book ai didi

r - R 中 lapply 函数中的意外内存地址分配

转载 作者:行者123 更新时间:2023-12-05 04:29:36 25 4
gpt4 key购买 nike

我最近在寻找错误并观察到您可以使用以下代码行重现:

library(lobstr)
lapply(1:10, function(g){
record <- list(EK = rep(1,1))
lobstr::obj_addr(record$EK)
})

lapply(1:10, function(g){
record <- list(EK = 1)
lobstr::obj_addr(record$EK)
})

本质上,我正在创建一个名为 record 的变量,它包含一个包含单个元素的列表。在一种情况下,我将此变量 (EK) 设置为 1,而在另一种情况下,我做同样的事情,但使用 rep(1,1)

在查看内存位置时(使用lobstr 包)我发现在设置EK = 1 的情况下,所有记录变量都具有相同的内存位置,而那些用 rep(1,1) 设置的都有自己的内存位置。这是带有输出的代码:

> lapply(1:10, function(g){
+ record <- list(EK = rep(1,1))
+ lobstr::obj_addr(record$EK)
+ })
[[1]]
[1] "0x7f9ff4bc3c20"

[[2]]
[1] "0x7f9ff4c8e668"

[[3]]
[1] "0x7f9ff4c8e438"

[[4]]
[1] "0x7f9ff4c8e208"

[[5]]
[1] "0x7f9ff4c8dfd8"

[[6]]
[1] "0x7f9ff4c8dda8"

[[7]]
[1] "0x7f9ff4c8db78"

[[8]]
[1] "0x7f9ff4c8d948"

[[9]]
[1] "0x7f9ff4c8d718"

[[10]]
[1] "0x7f9ff4c8d4e8"

>
> lapply(1:10, function(g){
+ record <- list(EK = 1)
+ lobstr::obj_addr(record$EK)
+ })
[[1]]
[1] "0x7f9ff4ca3190"

[[2]]
[1] "0x7f9ff4ca3190"

[[3]]
[1] "0x7f9ff4ca3190"

[[4]]
[1] "0x7f9ff4ca3190"

[[5]]
[1] "0x7f9ff4ca3190"

[[6]]
[1] "0x7f9ff4ca3190"

[[7]]
[1] "0x7f9ff4ca3190"

[[8]]
[1] "0x7f9ff4ca3190"

[[9]]
[1] "0x7f9ff4ca3190"

[[10]]
[1] "0x7f9ff4ca3190"

我的代码中的实际错误(在 mclapply() 调用中重复运行相同的模拟代码时收到相同的输出)原来不是由这个引起的(我认为这是因为 R使用相同的内存位置,如果确实如此),但取决于随机数生成器的初始化方式。

不过,我很好奇。从 ?obj_addr() 的帮助文件中,我了解到“每次创建对象时,对象的地址都是不同的”。那么,为什么一种方法会创建不同的内存地址而另一种方法不会呢?

最佳答案

谢谢康拉德,我不知道。我假设每个项目在内存中的某个地方都有自己的位置。但我现在明白了,如果我更改 lapply() 每次迭代中存储的内容,两种情况下的内存地址都会不同:

library(lobstr)
lapply(1:10, function(g){
record <- list(EK = rep(1,1))
record$EK<-round(runif(1,0,1)*10)
lobstr::obj_addr(record$EK)
})

lapply(1:10, function(g){
record <- list(EK = 1)
record$EK<-round(runif(1,0,1)*10)
lobstr::obj_addr(record$EK)
})

好吧,这样我就可以把它从我的 list 上拿下来担心了。再次感谢您的快速回复。

关于r - R 中 lapply 函数中的意外内存地址分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72271530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com