R 编程:删除父环境后,悬空子环境会发生什么情况?

  • 本文关键字:环境 什么情况 编程 删除 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>

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

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

调用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分配的内存不会释放,因为仍有对其环境的引用。

相关内容

最新更新