我已经用谷歌搜索了这个主题,但无济于事,希望有人能为我回答这个问题。
顺便说一句,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>
感谢有关此问题的任何帮助。
在您的示例中,尚未删除父环境。
调用rm(x)
不会删除对象本身,它只会删除绑定 的名称x
来自调用rm()
的环境。只要 对象可以从当前环境访问,它永远不会 删除。
解释名称和值的开头 高级R书的章节, 将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"
所以要回答名义上的问题:不可能达到这样的状态 仍然存在的子环境的父环境已 删除。
创建于 2018-08-23 由 reprex 包 (v0.2.0(.
父环境不会被删除,因为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
在删除child
之前,x
中为largevec
分配的内存不会释放,因为仍有对其环境的引用。