学习笔记,仅供参考,有错必纠


文章目录

  • R开发
    • 应用R语言中的函数环境空间
      • R语言的函数环境空间
      • 封闭环境
      • 绑定环境
      • 运行环境
      • 调用环境
      • 函数环境空间图示

R开发

应用R语言中的函数环境空间

R语言的函数环境空间

在R语言中,变量、对象、函数都存在于环境空间中,而函数又可以有自己的环境空间,我们可以在函数内再定义变量、对象和函数,循环往复就形成了我们现在用的R语言环境系统。

一般情况下,我们可以通过new.env去创建一个环境空间,但更多的时候,我们使用的是函数环境空间。函数环境空间,包括以下四方面的内容:

  • 封闭环境,每个函数都有且只有一个封闭环境空间,指向函数定义的环境空间。

  • 绑定环境,给函数指定一个名字,绑定到函数变量,如fun1<-function() {1}

  • 运行环境,当函数运行时,在内存中动态产生的环境空间,运行结束后,会自动销毁。

  • 调用环境,是指在哪个环境中进行的方法调用,如fun1<-function() {fun2()},函数fun2在函数fun1中被调用。

封闭环境

封闭环境是对函数空间的一个静态定义,在函数定义时指向所在的环境空间。我们在当前的环境空间定义一个函数f1,并通过environment函数来查看封闭环境:

y <- 1
f1 <- function(x) {x + y}
environment(f1) #<environment: R_GlobalEnv>

绑定环境

绑定环境就是把函数的定义和调用通过函数变量连起来。

我们新建一个环境空间e,在e的环境空间中定义一个函数g,就相当于把一个函数绑定到g变量,通过找到e环境空间中的g变量,就可以调用这个函数:

e <- new.env()
e$g <- function() {1}
#查看函数g的定义
e$g #function() {1}
#调用函数g
e$g() #1

在环境空间e中再定义一个嵌套函数:

e <- new.env()
e$f <- function() {function() {1}}
e$f # function() {function() {1}}
e$f() # function() {1}
e$f()() #1

查看函数g和f的封闭环境:

environment(e$g) #<environment: R_GlobalEnv>
environment(e$f) #<environment: R_GlobalEnv>

运行环境

运行环境是函数被调用时产生的内存环境。运行环境是临时的,当函数运行完成后,运行环境会被自动销毁。在运行环境中定义的变量、对象和函数,也是动态创建的,随着内存释放而销毁。

定义一个函数g,在函数g中,有临时变量a和参数x:

g <- function(x) {message("Are you OK?")print(environment())a <- 1a <- a + xreturn(a)
}g(10)
#输出start
Are you OK?
<environment: 0x00000000153fb488>
[1] 11
#输出endg(10)
#输出start
Are you OK?
<environment: 0x00000000153ae1a8>
[1] 11
#输出end

可以看到,我们两次运行得到的环境地址是不同的,明函数的运行时环境,是内存临时分配的。

调用环境

调用环境是指函数是在哪个环境中被调用的。匿名函数通常是在定义的封闭环境中被调用。

h <- function() {x <- 20x <<- 5function() {x}
}x <- 10
r1 <- h()
r1() #20
x #5

函数环境空间图示

代码:

x<-5               # 在当前环境定义变量xfun1<-function() {     # 在当前环境定义fun1print("fun1")          # 打印fun1环境空间print(environment())x <- 1               # 在fun1函数环境中,定义变量xfunction() {print("funX")     # 打印匿名环境空间print(environment())x+15               # 从一级父环境空间中,找到变量x}
}fun2 <- function() {     # 在当前环境定义fun2print("fun2")          # 打印fun2环境空间print(environment())x<-2               # 在fun2函数环境中,定义变量xfun1()              #调用函数fun1
}f2 <- fun2()          # 在当前环境空间中,调用函数fun2,绑定到f2
fx <- f2()               # 在当前环境空间中,调用匿名函数,并绑定到fx
fx

R开发(part8)--应用R语言中的函数环境空间相关推荐

  1. c语言程序可以单独编译,c语言中的函数可不可以单独进行编译?_后端开发

    在C语言中,要求参加运算的数必须是整数的运算符是什么_后端开发 在C语言中要求参加运算的数必须是整数的运算符是"%":"%"符号在c语言中有两种释义,一是求余符 ...

  2. python中可以使用变量来引用函数吗_如何在python语言中使用函数变量并调用函数...

    在python语言中,除了常规变量之外,还有函数变量.把函数本身赋值给变量,这个变量为函数变量. 工具/原料 python pycharm 截图工具 WPS 方法/步骤 1 在已新建的python文件 ...

  3. C语言中图形函数及其用法

    C语言中图形函数及其用法  Turbo C 2.0具有丰富的图形功能,它提供了70多个图形函数.在这里只介绍最常用的一部分,其余的图形函数及用法可参阅相关书籍.图形函数均在头文件"graph ...

  4. 3.1 Go语言中的函数与方法

    函数定义语法 与大部分语言一致,Go语言中的函数定义与其他语言基本一致 func function_name(Parameter-list) {// function body... }func fu ...

  5. c语言中什么函数可以作为虚函数,C++语言中的“虚函数”就像C语言中的指针,必须要弄懂的...

    上一节较为详细的讨论了C++语言中基类被派生类继承过程中的内存模型,尤其较为详细的分析了虚函数及其虚表.虚表指针在内存中是如何分布,如何存储的,这对于理解C++语言中的"动态绑定" ...

  6. C语言中的函数(重点介绍自定义函数)

    C语言中的函数分为库函数和自定义函数,本篇重点介绍自定义函数中的函数调用 函数由一个或多个语句块组成,负责完成某项特定任务, 相较于其他代码,具有相对的独立性,一般会有返回值和输入参数,提供对过程的封 ...

  7. 满满干货赶紧进来!!!轻松掌握C语言中的函数

    摘要:本文对C语言中的函数进行全方面详细讲解,主要包括函数分类,函数参数,函数调用.函数声明和定义.函数递归.函数练习.全方面带你深度理解函数,耐心看完,相信看完这篇你会有不菲的收获~~ C语言-- ...

  8. C语言中的函数指针、函数的直接/间接调用、C# 委托(自定义委托、内置泛型委托、委托的实例化、委托的一般使用(模板方法、回调方法)、泛型委托、多播委托、同步/异步使用委托)

    文章目录 C语言中的函数指针 函数的直接调用与间接调用 Java中没有与委托对应的功能实体 C# 委托 C# 自定义委托类型 C# 内置泛型委托类型 委托的实例化 委托也支持泛型的使用 委托的一般使用 ...

  9. c语言程序中函数类型,C语言中的函数分别有什么?

    C语言函数是一种函数,用来编译C语言,所在库函数为ctype.h,分为分类函数,数学函数,目录函数,进程函数,诊断函数,操作函数等. C语言中的函数在其他编程语言中也称为过程或子程序.要执行任务,我们 ...

最新文章

  1. Linux(CentOS 7_x64位)系统下安装ACPYPE
  2. 【Android 进程保活】提升进程优先级 ( 使用前台 Service 提高应用进程优先级 | 效果展示 | 源码资源 )
  3. 远程桌面连接管理问题解决方法大全
  4. php树莓派魔镜,用树莓派和显示器制作一面“魔镜”
  5. php判断同一天,PHP判断两个时间戳是否在同一周同一月等 - YangJunwei
  6. C++ map的简单实现
  7. 关于Git GUI的使用方式
  8. matlab学习--语言基础
  9. Python 语言程序设计(4-2)分支循环--无限循环
  10. JQuery Jcrop—JQuery Jcrop 图像裁剪工具学习
  11. iOS 8.0正式公布啦
  12. 在Ubuntu 16.04 64bit上安装谷歌地球Google Earth免费版
  13. 【VUE】如何关闭代码规范extra semicolon
  14. 我爱过你吗--我看美丽心灵的永恒阳光
  15. 7-2 jmu-python-汇率兑换
  16. 细胞制备流程图_Nat Med背靠背丨 疗效差?毒性大?B细胞恶性肿瘤的CAR-T免疫治疗或可出现新进展...
  17. CAD多行文本中文字的堆叠
  18. 公司注册涉及前置审批和后置审批的经营范围有哪些(2019年上海最新版)
  19. 【Android】从无到有:手把手一步步教你自定义RecyclerView手势监听
  20. 简单好用的免费内网穿透工具

热门文章

  1. 通俗讲清楚为什么使用信息熵增益比而不是信息熵增益?
  2. Ubuntu下面安装字体后,显示不完全的问题
  3. ubuntu Linux18.10/19.10下的护眼宝
  4. cpu倍频模式怎么调_CPU频率被锁定到800mhz怎么办?
  5. 苹果系统更新服务器繁忙,如何解决升级MacOS 10.13时的常见问题
  6. 二维非稳态导热微分方程_室内湿度影响验证:非真空型稳态法导热仪的正确使用方式...
  7. mybatis项目报java.sql.SQLException: Numeric Overflow的异常
  8. 推荐一款ui架构--frozenui
  9. (十四)java版spring cloud+spring boot 社交电子商务平台-使用spring cloud Bus刷新配置...
  10. Prometheus Querying Function rate() vs irate()