a.k.a玩火......
以下不起作用:
rstd.obj <- as.environment("tools:rstudio")
detach("tools:rstudio")
attach(rstd.obj, name="tools:rstudio")
好吧,它似乎有效,但随后会出现各种奇怪的错误。问题非常令人讨厌(虽然我确信这是一个很好的理由)attach
制作环境的副本并附上它,而不是直接附加环境:
rstd.obj
# <environment: 0x000000000930edd0>
# attr(,"name")
# [1] "tools:rstudio"
as.environment("tools:rstudio")
# <environment: 0x000000000a21b4c8>
# attr(,"name")
# [1] "tools:rstudio"
注意环境实际上是如何不同的(如果您查看复制的do_attach
中的src/main/envir.c@2124(R3.0.2)
的源代码,也会确认这一点。)
然而,这完全正常(在重新启动RStudio以重置所有内容之后):
rstd.obj <- as.environment("tools:rstudio")
rstd.parent <- as.environment("package:stats") # this was #3 on search path for me
detach("tools:rstudio")
# WARNING: YOU'RE PLAYING WITH FIRE IF YOU RUN THIS, DO
# SO AT YOUR OWN RISK:
parent.env(.GlobalEnv) <- rstd.obj
parent.env(rstd.obj) <- rstd.parent
我们只使用detach
而不是attach
/ detach
,而是使用parent.env<-
强制将对象插回到搜索路径中。另一方面,我猜测上面的内容可能接近于R Core在?parent.env
发出警告时的想法:
替换函数
parent.env<-
非常危险,因为它可以用于以违反内部C代码假设的方式破坏性地更改环境。它可能会在不久的将来被删除。
解决此问题的另一种方法是使用detach
/ attach
,然后循环浏览搜索路径上tools:rstudio
环境中的所有函数,并将其环境重置为现在在搜索路径上复制原始环境(顺便说一下,这就是Rstudio开始破坏的原因:功能环境仍然是从搜索路径中删除的对象,但该环境不再在搜索路径中,只是它的副本) 。但是,这感觉非常难堪。
此外,如果有人知道有关“内部C代码所做的假设”的更多细节,我会非常有兴趣听到它们。显然,我们可以在搜索路径中引入循环(不,我不小心只是用这些例子来搞乱......),但是还有其他问题吗?
编辑:关于上述内容,来自 R-devel 的超级有用信息:
我想建议改变R语言以便调用 包命名空间或包导入上的'parent.env&lt; - '是运行时 错误。 ... 我还想在一个环境中调用parent.env&lt; - 调用堆栈错误,出于同样的原因,但它并不那么明显 我现在如何有效地实施。我们至少可以吗? 记录为'未定义的行为'?
Luke Tierney的回答:
我会调查一下
这似乎证实了关注是以一种R可能无法跟踪的方式改变呼叫或搜索路径中的调用堆栈,而不是通常认为parent.env<-
对其他环境链是危险的(显然读取b / w行)这里)。