(4) data步底层运行逻辑—partⅢ

接下来我就用一个例子为例,首先代码入下:


为了方便得到的输入数据class如下,一共三行。


首先根据我的代码,输入数据集为class,输出数据集为class_1,运行过程如下:

        编译阶段:

        主要进行两个操作,第一步:把class里面的变量的表头copy到PDV里面,变量分别是name、sex、age、height和weight五个变量,第二步:由于后面的语句生成了grp这变量,在编译阶段也会开辟到PDV中。所以在PDV里面经过编译阶段共有六个变量。

        执行阶段:

        第一行观测:

        首先从输出数据集class里面拿出第一行观测,放到PDV里面,由于最开始,PDV会进行初始化,也就是说最开始的时候,PDV里面全是空的,这个时候,运行43行代码的时候,把class的第一行观测(name='阿尔弗雷德')依次填入name,sex,age,height,weight等变量,然后将“Total组”这个值放进grp变量,然后由于45行代码output语句,就会把pdv所有变量的值输出到输出数据集class_1中,输出的值如图所示(数据集class_1的第一行):


然后我们继续跑程序,46行代码的if语句,这个时候在PDV里面进行判断,由于sex的值是 “男”,所以这个时候我们需要把grp这个变量的值替换成“第一组”,然后继续跑代码,由于48行的output语句,需要将PDV里面的值输出到输出数据class_1中,也就是上图所示的第二行数据,到此为止我们的输入数据集class的第一行观测已经完毕;

   第二行观测开始:

(这个时候就需要注意,前面我讲过run语句之前是会隐含output和return语句的,但是如果有强制输出output语句,就只会隐含return语句)所以当class的第一行观测运行完毕的时候,这个时候由于隐含的return语句,就重新回到了43行代码set语句,这个时候我们拿出class的第二行观测(name='爱丽丝'),这个时候,首先需要进行初始化,这个是有规矩的(前面讲过),在这个数据集中,set的class里面的变量name,sex,age,height,weight是不会被初始化的,但是grp(由于赋值语句)会被初始化为空值,这个时候在PDV里面,第一步,class的第二行观测会覆盖掉之前PDV里面的值,第二步,将’Total组‘赋值到grp变量中(注意,这个变量之前由于初始化是空值)。然后由于45行代码,会将PDV里面的值输出到class_1中,如图所示class_1的第三行观测。然后继续走,由于46行代码,sex的值是’女‘,会将“第二组”覆盖掉grp变量里面的值。然后由于48行代码,会将PDV里面的值输出到class_1数据集中。如图所示class_1的第三行观测。然后由于隐藏的return语句,然后继续循环,直到输入数据的全部观测执行完毕,所以最后得到的输出数据集class_1为6条观测。

你可能感兴趣的:((4) data步底层运行逻辑—partⅢ)