R语言环境、堆栈的介绍 - sys.call sys.frame sys.parent sys.nframe 之一
详细介绍R语言base包environment系列的函数
函数 | 使用说明 |
---|
environment(fun = NULL) | 返回与该函数或者表达式联系的环境 | environment(fun) = values | 对fun所联系的环境进行设置 | is.environment(x) | 判断对象x是不是环境 | emptyenv() | 返回空环境 | baseenv() | 返回base包的环境 | parent.env(env) | 返回一个环境的父环境 | parent.env(env) = value | 对一个环境的父环境进行设置 |
上述代码说明
> f <- function(x,y) return(a = x + y)
> str(f)
function (x, y)
- attr(*, "srcref")= 'srcref' int [1:8] 1 6 1 36 6 36 1 1
..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x000000001f581820>
我们定义了一个函数f ,使用str(f) 查看了这个函数的环境,我们每定义一个函数R系统就会为这个自动生成一个环境。 上述代码说明
> environment(f)
<environment: R_GlobalEnv>
> e <- new.env()
> e
<environment: 0x00000000120bf930>
> environment(f) <- e
> f
function(x,y) return(a = x + y)
<environment: 0x00000000120bf930>
> parent.env(e)
<environment: R_GlobalEnv>
介绍父环境与子环境之间的关系
环境: 我们可以把R语言中的环境看作为一种特殊的数据结构,一个环境里边的元素可以是任意的数据结构(函数、数据框等等)。 代码说明
> e
<environment: 0x00000000120bf930>
> e$a <- 1:10
> e$b <- iris
> e$c <- f
ls.str :查看环境中具体的变量
> ls.str(e)
a : int [1:10] 1 2 3 4 5 6 7 8 9 10
b : 'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
c : function (x, y)
多个名字可以指向同一个对象
> e$d <- e$c
> e$d
function(x,y) return(a = x + y)
<environment: 0x00000000120bf930>
如果一个对象在当前环境下没有找到,那么就会去它的父环境中寻找,直到遍历完所有的环境为止。 代码说明:
> temp <- new.env()
<environment: 0x0000000008d587e0>
> temp$f1 <- 1:10
> f1
错误: 找不到对象'f1'
当前的工作环境是<environment: R_GlobalEnv> ,对象f1 在环境<environment: 0x0000000008d587e0> 中所以f1 无法在<environment: R_GlobalEnv> 找到。
为全局环境指定父环境为temp就可以找到对象f1 代码说明:
> a <- globalenv()
> a
<environment: R_GlobalEnv>
> parent.env(a) <- temp
> f1
[1] 1 2 3 4 5 6 7 8 9 10
介绍包与父环境之间的关系
> temp <- globalenv()
> library(caret)
> library(randomForest)
> library(class)
> library(e1071)
> search()
[1] ".GlobalEnv" "package:e1071" "package:class"
[4] "package:ROCR" "package:randomForest" "package:caret"
[7] "package:lattice" "package:ggplot2" "package:stats"
[10] "package:graphics" "package:grDevices" "package:utils"
[13] "package:datasets" "package:methods" "Autoloads"
[16] "package:base"
> parent.env(temp)
<environment: package:e1071>
attr(,"name")
[1] "package:e1071"
attr(,"path")
[1] "E:/R-4.1.2/library/e1071"
在我们加载包之后最后一个加载的包是全局环境的父环境,倒数第二个加载的包是最后一个加载包的父环境,以此类推。
用于访问函数堆栈的函数介绍
此部分为R语言中较为难理解的部分,而且csdn上关于此部分的介绍也比较少,我在这里给大家做详细的说明以及举例子说明如何使用!!! R语言中使用了frame 我们可以把它理解为层 ,全局环境下的层 为0,之后函数每嵌套一次,层 就会增加1
函数介绍
函数名 | 使用说明 |
---|
sys.call | 只能返回当前层的函数定义 | sys.frame | 返回第几层的变量 | sys.nframe | 返回当前的第几层 | sys.function | 返回函数的定义函数体 | sys.parent | 返回当前层的父环境 |
给出具体的实例来说明函数如何使用:
sys.call:
> t1 <- function(){
+ a2 <- 'asd'
+ str(sys.call(0))}
> t1()
language t1()
> t1 <- function(){
+ a2 <- 'asd'
+ t2 <- function(){
+ str(sys.call(0))}
+ t2()}
> t1()
language t2()
- attr(*, "srcref")= 'srcref' int [1:8] 5 7 5 10 7 10 5 5
..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x000000000d320d98>
> t1 <- function(){
+ a2 <- 'asd'
+ t2 <- function(){
+ str(sys.call(-1))}
+ t2()}
> t1()
language t1()
> t1 <- function(){
+ a2 <- 'asd'
+ t2 <- function(){
+ str(sys.calls())}
+ t2()}
> t1()
Dotted pair list of 2
$ : language t1()
$ : language t2()
..- attr(*, "srcref")= 'srcref' int [1:8] 5 7 5 10 7 10 5 5
.. ..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x000000000d2299d0>
以上就是sys.call的使用说明。
sys.frame:
> t1 <- function(){
+ a1 <- 1
+ t2 <- function(){
+ print(ls(envir = sys.frame(-1)))}
+ t2()}
> t1()
[1] "a1" "t2"
> t1 <- function(){
+ a1 <- 1
+ a2 <- 2
+ t2 <- function(){
+ a3 <- 3
+ t3 <- function(){
+ print(ls(envir = sys.frame(-2)))}
+ t3()}
+ t2()}
> t1()
[1] "a1" "a2" "t2"
以上就是关于sys.frame的使用,这只能在函数体内部使用。
sys.parent and sys.nframe:
代码展示:
> t1 <- function(){
+ a1 = 'jiang'
+ t2 <- function(){
+ cat('当前所在的层为',sys.nframe(),'\n')
+ cat('当前下的父环境为',sys.parent(),'\n')
+ cat('所有的父环境为',sys.parents(),'\n')}
+ t2()}
> t1()
当前所在的层为 2
当前下的父环境为 1
所有的父环境为 0 1
以上就是关于sys.parent sys.nframe sys.parents的介绍。
有关函数体内部堆栈的介绍我们就先到这里,如果有不明白的地方,欢迎大家在评论区提问。后面还会分享关于堆栈函数sys 系列的其他函数以及更深刻的例子。谢谢大家!
|