SAS:为什么没有'注意:变量是单元化的'当未初始化的变量是数组的一部分时?

Vin*_*ent 3 arrays initialization sas

承认,这个问题不是很有趣,但是由于sas-log中的警告可能非常有用,有时候我想知道这里发生了什么.

考虑以下最小的例子.在第0步中,我们创建了一个数据集.在步骤1中,我们想要将步骤0中某个变量的值复制到step1,但是我们忘记了变量的正确名称(或者我们没记错,但是当我们离开时有人更改了它.)我写了两个版本的step1,命名为step1a和step1b .

Data step0; 
Dog = 1;
run;

Data step1a;
value = cat; 
run;

Data step1b; 
array animals cat;
value = animals[1];
run;
Run Code Online (Sandbox Code Playgroud)

不用说,step1的两个版本都生成相同的数据集,在这种情况下是一个带有变量'value'和'cat'的空数据集.

但是:当编写step1a的方式运行step1时,SASlog会警告我们出错了:

NOTE: Variable cat is uninitialized.
Run Code Online (Sandbox Code Playgroud)

我们可以回到我们的代码,注意我们认为猫是一直是一只狗,看到我们的方式的错误,并产生我们想到的正确的数据集.

另一方面,当编写step1b的方式运行step1时,SASlog将表现得好像一切都很好,我们可以在街上唱歌跳舞,只是为了发现多年后狗的价值永远消失.

所以问题是:为什么SAS在第二种情况下认为不需要警告?

Joe*_*Joe 5

那是因为你已经通过数组声明在第三个例子中初始化了变量.声明数组时,除非您在数组定义中指定$(在这种情况下它们是缺少的字符(长度为8)),或者指定了初始化值,否则任何尚未存在的变量都会初始化为Numeric missing.