我没有用谷歌搜索这个问题,希望有人会帮我回答这个问题。
顺便说一句,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>
感谢有关此问题的任何帮助。
答案 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创建。