SAS 嵌套 do 循环与数组

SAS nested do loops with arrays

在理解以下代码时遇到问题。此代码段应该输出一个数据集,该数据集将目标值 (sasuser.ctargets) 与实际值 (sasuser.monthsum) 进行比较。观测按月和年匹配并填充到 targets 数组。该代码完全可以正常工作,但在我看来它不应该。

查看嵌套的 DO 循环:

Targets 在嵌套的 DO 循环中由 yearj 索引。我知道外循环使用了三个迭代(i=1 to 3):一个用于年份变量(1997-1999)的每个值。然而,Year 是在 DO 循环之外声明的。因此,如果自动变量 _n_ 在 DO 循环的第一次迭代中创建目标数组,那么 targets 数组到底是如何正确填充 1998 年和 1999 年的,直到后续迭代才读取这些数据数据步骤? year 作为迭代器是如何工作的?

data work.lookup1;
    array targets(1997:1999,12) _temporary_;
    if _n_=1 then do i=1 to 3;
        set sasuser.ctargets;
        array mnth(*) Jan--Dec;
        do j=1 to dim(mnth);
            targets(year,j)=mnth(j);
        end;
    end;
    set sasuser.monthsum(keep=salemon revcargo monthno);
    year=input(substr(salemon,4),4.);
    ctarget=targets(year,monthno);
    format ctarget dollar15.2;
run;

唯一可行的方法是变量 YEAR 在数据集 SASUSER.CTARGETS.