gpt4 book ai didi

r - 设置parent.env,然后设置 `detach`,segfaults

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

在R中执行以下代码时,段可重复出现段错误(3.0.2,但我认为其他版本也是如此):

ns = new.env(parent = .BaseNamespaceEnv)
local(f <- function () 42, envir = ns)
x = list2env(as.list(ns), parent = as.environment(2))
parent.env(.GlobalEnv) = x
detach()

是的,我知道 documentation on parent.env

The replacement function parent.env<- is extremely dangerous as it can be used to destructively change environments in ways that violate assumptions made by the internal C code. It may be removed in the near future.



这就是我在这里遇到的问题。但是,我想了解 ,为什么是这种行为,以及如何避免这种行为。

以下简化的代码 而不是不会出现此问题:
x = new.env(parent = as.environment(2))
local(f <- function () 42, envir = x)
parent.env(.GlobalEnv) = x
detach()

......所以 x包含一个其 parent.env是不同的(未附加)环境的函数似乎有所不同。

同样,使用 attach而不是 parent.env<-也不会导致崩溃。 (所以为什么不简单地使用 attach?因为在我的代码中, .GlobalEnv部分是一个变量,可以引用不同的环境。)

故障转储告诉我,段故障发生在 do_detach( envir.c)中。该代码包含以下几行:
isSpecial = IS_USER_DATABASE(s);
if(isSpecial) {
R_ObjectTable *tb = (R_ObjectTable*) R_ExternalPtrAddr(HASHTAB(s));
if(tb->onDetach) tb->onDetach(tb);
}

我不知道 IS_USER_DATABASE是做什么的-也许这是相关的吗?仅将 .onDetach方法添加到我的环境( .onDetach = function (x) x)并没有帮助。

最佳答案

注意:这比真正的答案更像是评论,但无法在评论字段中显示。我有一个 loosely related question ,并且一直在尝试更好地了解parent.env<-的局限性。

在您的情况下,请注意,问题实际上与list2env有关,而不与函数有关。考虑:

f.1 <- function() NULL
ns.1 <- new.env(parent = .BaseNamespaceEnv)
x.1 <- new.env(parent = as.environment(2))
environment(f.1) <- ns.1
x.1$f.1 <- f.1
parent.env(.GlobalEnv) <- x.1
detach()

可以,但是:
x.2 <- list2env(list(a=1), parent=as.environment(2))
parent.env(.GlobalEnv) <- x.2
detach()

崩溃。在这里,除了使用 list2env创建的环境外,我们甚至没有对作为父级使用的环境做任何复杂的事情。从源代码上看,我看不出为什么 list2env是一个问题,但是 $<-并不是一个明显的问题,因为两者在内部似乎都使用 defineVar,但是显然有很多我不了解的事情。

关于r - 设置parent.env,然后设置 `detach`,segfaults,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22790484/

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