第四天

函数在运行时,函数所创建的任何对象以及参数会以对象的形式存储于运行时环境,参数的名称就是新对象的名称,新对象的值就是用户输入的参数值。

没有运行命令shuffle(poker2)之前,d3没有值,运行shuffle(poker2)命令之后,d3<-poker2,以d3命名的对象便出现在了全局环境中。这就是上面说的参数的名称 参数的名称就是新对象的名称,新对象的值就是用户输入的参数值。

调用函数时的活动环境又可以成为调用环境(calling environment)。

R运行时需要调动一些对象,通常来说这些对象都是内部定义的参数,按照作用域规则,R会先从运行时环境搜索,然后父环境,并依次向上检索,而内部参数在运行时环境就可以搜索到。

函数运行后的结果会返回到调用环境,如果将函数的运行结果赋值给某个对象,那么该对象会存储在调用环境中。

函数中的对象,如果是在全局环境定义的,那么函数运行时就会在全局环境中搜索到原对象;如果是在函数内部定义的,那么就会在运行时环境搜索到该对象副本。

这个概念有些难理解,能不能理解成,函数运行时,运行时环境相当父环境的一个拷贝环境,将父环境的对象拷贝到运行时环境中进行一系列运算然后返回结果,不管在运行时环境对这些拷贝对象做如何的更改,父环境中的原对象都不会发生变化。这就类似于PS中新建一个拷贝图层,为了不改变原图层,在复制图层中进行修图,最终要的是拷贝图层呈现的结果。

第四天_第1张图片
现在就想象是在用函数画画,既可以在原图层画,也可以在复制图层画。上述的命令含义依次是:在原图层(工作时环境的父环境)上建立d3,在poker2的复制图层上编辑poker2,显示poker2原图的前三行。接下来将第二步和第三步重复一下,注意观察结果,第二步的值变了,第三步依然没变。
第四天_第2张图片
将此图和上图比较,差别就在于上图运算过程中除了对象d3是在全局环境,运行时环境中其它的对象都是复制对象,除非输入的参数也是d3。下图中poker2对象在全局环境,整个函数运算也都是针对全局环境中的poker2进行的。所以上下图结果又很大的区别。

你可能感兴趣的:(第四天)