分离和重新连接"工具:rstudio"

时间:2014-10-14 17:42:25

标签: r search rstudio environment

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行)这里)。

0 个答案:

没有答案