R编程:悬挂了父环境的子环境会发生什么情况?

时间:2018-08-23 17:10:07

标签: r

我没有用谷歌搜索这个问题,希望有人会帮我回答这个问题。

顺便说一句,parent.env(child)显示了父环境x,但是由于我删除了它,所以对我来说,为什么parent.env(child)仍会返回该环境没有意义:

例如

x<-new.env()
child<-new.env(parent=x)
print(x) # shows <environment: 0x00000000217b8498>
parent.env(child) # shows <environment: 0x00000000217b8498>
rm(x)
parent.env(child) # still shows <environment: 0x00000000217b8498>

感谢有关此问题的任何帮助。

2 个答案:

答案 0 :(得分:4)

父环境不会被删除,因为child依赖于它。 rm将从内存命名表中删除一个名称,然后修改绑定到该名称的值的状态。 gc将处理最后的内存删除和释放,但前提是没有对该值的进一步引用。

请考虑以下内容:

x$largevec <- numeric(1e7)
memory.size()
[1] 99.69
rm(x)
gc()
           used (Mb) gc trigger  (Mb) max used (Mb)
Ncells   217423 11.7     460000  24.6   350000 18.7
Vcells 10399066 79.4   15376413 117.4 10402077 79.4
memory.size()
[1] 97.51
rm(child)
gc()
         used (Mb) gc trigger (Mb) max used (Mb)
Ncells 217416 11.7     460000 24.6   350000 18.7
Vcells 399008  3.1   12301130 93.9 10402077 79.4
memory.size()
[1] 21.2

largevec中为x分配的内存只有在删除child后才会释放,因为仍然有对其环境的引用。

答案 1 :(得分:4)

在您的示例中,父环境未被删除

调用rm(x)不会删除对象本身,只会删除绑定 来自调用x的环境中名称rm()的名称。 一个物体可以从当前环境中到达,它永远不会 删除。

粗略地说出Advanced R书Names and Values chapter的开头, 考虑x <- new.env()做两件事可能会有所帮助: 环境对象,然后将该对象绑定到名称x 当前环境。

即使取消了原始绑定,只要我们可以到达对象, 我们可以在全球环境中恢复对它的绑定。这是一个扩展 您的示例来演示:

x <- new.env()
x
#> <environment: 0x0000000015043a78>
x$foo <- "bar"

y <- new.env(parent = x)
parent.env(y)
#> <environment: 0x0000000015043a78>

rm(x)
parent.env(y)
#> <environment: 0x0000000015043a78>

z <- parent.env(y)

z # the name z is now bound to the same object that x was
#> <environment: 0x0000000015043a78>
z$foo
#> [1] "bar"

因此要回答名义上的问题:不可能达到以下状态 仍然存在的子环境的父环境是 删除。

reprex package(v0.2.0)于2018-08-23创建。