jua*_*nli 6 environment r function
我对函数的不同环境有几个问题.请看以下示例:
environment(sd)
# <environment: namespace:stats>
Run Code Online (Sandbox Code Playgroud)
命名空间:stats是否指向函数sd的封闭环境?
pryr::where(sd)
# <environment: package:stats>
Run Code Online (Sandbox Code Playgroud)
package:stats是否指向函数sd的绑定环境?
根据Hadley Wickham的高级R说:"封闭的环境属于这个功能,永远不会改变......"
但是功能的封闭环境可以改变如下:
new.env <- new.env()
environment(f) <- new.env
Run Code Online (Sandbox Code Playgroud)
函数'environment属性表示函数的执行环境,对吗?关于R通过环境查找内容的在线文章
总结一下我的问题:
stats什么?它类似于一前一后在这里.
Jor*_*eys 15
TLDR:
功能环境
在谈论函数时,您必须区分4种不同的环境:
find()为您提供绑定环境.environment()为您提供封闭的环境.为什么这很重要
每个环境都有一个特定的功能:
emptyenv().您可以更改封闭环境
实际上,您可以改变封闭环境.它是您无法更改的包中函数的封闭环境.在这种情况下,您不会更改封闭环境,实际上是在新环境中创建副本:
> ls()
character(0)
> environment(sd)
<environment: namespace:stats>
> environment(sd) <- globalenv()
> environment(sd)
<environment: R_GlobalEnv>
> ls()
[1] "sd"
> find("sd")
[1] ".GlobalEnv" "package:stats" # two functions sd now
> rm(sd)
> environment(sd)
<environment: namespace:stats>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,第二个sd具有全局环境作为封闭和绑定环境,但原始sd仍然在包环境中找到,其封闭环境仍然是该包的命名空间
执行以下操作时可能会出现混淆:
> f <- sd
> environment(f)
<environment: namespace:stats>
> find("f")
[1] ".GlobalEnv"
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?封闭的环境仍然是名称空间''stats''.这就是创建函数的地方.但是,绑定环境现在是全球环境.这就是名称"f"绑定到对象的位置.
我们可以将封闭环境更改为新环境e.如果你现在检查,封闭的环境变为e,但e它本身是空的.f仍然受到全球环境的约束.
> e <- new.env()
> e
<environment: 0x000000001852e0a8>
> environment(f) <- e
> find("f")
[1] ".GlobalEnv"
> environment(f)
<environment: 0x000000001852e0a8>
> ls(e)
character(0)
Run Code Online (Sandbox Code Playgroud)
封闭的环境e是全球环境.所以f仍然好像它的外壳是全球环境.环境e包含在其中,因此如果找不到某些内容e,该函数将在全局环境中查找,依此类推.
但由于e是一个环境,R称之为父环境.
> parent.env(e)
<environment: R_GlobalEnv>
> f(1:3)
[1] 1
Run Code Online (Sandbox Code Playgroud)
命名空间和包环境
这个原则也是"技巧"包使用:
原因很简单:对象只能在您所处的环境中或其封闭环境中找到.
举例说明:
现在假设您创建一个环境为空的环境作为父项.如果将此作为函数的封闭环境使用,则不再起作用.因为现在你绕过了所有的包环境,所以你再也找不到一个函数了.
> orphan <- new.env(parent = emptyenv())
> environment(f) <- orphan
> f(1:3)
Error in sqrt(var(if (is.vector(x) || is.factor(x)) x else as.double(x), :
could not find function "sqrt"
Run Code Online (Sandbox Code Playgroud)
父框架
这是它变得有趣的地方.父框架或调用环境是查找作为参数传递的值的环境.但是父框架可以是另一个功能的本地环境.在这种情况下,R首先查看该另一个函数的本地环境,然后在调用函数的封闭环境中,一直到全局环境,附加包的环境,直到它到达空环境.这就是"找不到对象"错误的地方.
| 归档时间: |
|
| 查看次数: |
659 次 |
| 最近记录: |