IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> R语言环境、堆栈的介绍(sys.call sys.frame sys.parent sys.nframe)之一 -> 正文阅读

[移动开发]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> #environment查看f相联系得环境
> e <- new.env() #创建一个新环境
> e
<environment: 0x00000000120bf930>
> environment(f) <- e #将环境e与f相联系
> f  #查看f发现f与e相联系
function(x,y) return(a = x + y)
<environment: 0x00000000120bf930>
> parent.env(e) #返回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系列的其他函数以及更深刻的例子。谢谢大家!

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:29:59  更:2022-05-05 11:34:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 23:01:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码