楼主,字符不够可以截图。
另,我大概理解了楼主的意思,不过楼主应该再表述地清楚些。
变量a应该是已知的,至于q1,q2,从楼主的程序上看,貌似似乎都有赋值与计算语句,因此我猜测,q1,q2都有初始值,你的意思可能是根据条件对此进行重新赋值。
所以我猜测你的问题是:
当a=0时,你使用了如下语句:q1=q2+0;q2=lag(q1);
为什么在第二个a=0的记录时,q2,q1并没有赋值为28654,而仍然是初始的57。
首先不论函数lag,语句本身有顺序问题,首先赋值的应该是q2,然后是q1。不然即使q2的赋值实现你要的效果,但是赋予q1的值仍然是未更新的q2值。
其次是lag函数,有以下这几点:
第一,lag函数的作用表面上看是用来取上一个值,但其内部是两个动作,一个是在临时队列中取头部元素然后删除,下一个元素变为头部元素(remove and return),另一个是往临时队列中添加元素,替代成为底部元素。而临时队列的存在,显而易见是为了下一次的取值而用来存放历史数据。其是在第一次调用时初始化。
第二,lag函数只有在它被调用的时候才会去执行,也就是说,如果lag函数是需要满足特定条件的时候才调用的话,只有在条件满足时,才会调用lag函数,所以语句中,只有在a=0的时候,lag才会调用执行,然后触发两个动作。如之前提到的,lag的进队列与出队列的动作是一起执行,因此,也只有当a=0时,lag才会往队列中添加元素。
第三,如果想对要重新赋值的变量进行lag,并想取出重新赋值的数据,则重新赋值的语句应该在lag语句之前。至于原因就是lag函数的运行机制。
此例中,个人认为是无法使用lag函数的,主要原因如下:
q2=lag(q1),当执行这条语句时,给q2赋予了队列中top的数据,然后移除top。同时把当前observation中q1的值(从楼主给出数据值猜测是57)添加到了队列的bottom,但实际上我们希望的是添加到队列的buttom是更新后q1的值(值为:28654),而更新q1的赋值语句是在q2=lag(q1)之后,因此q1更新后的值是无法在lag函数执行的时候添加到队列的buttom。
所以此列的实现个人认为还是使用retain。
个人意见,楼主集思广益吧。