在0观察数据集上使用VTYPE

时间:2015-07-30 13:00:42

标签: sas

在0观察数据集上使用VTYPE时,我无法获得所需信息。

这是MWE:

使用1个变量和1个观察值创建简单集。

data fullset;
myvar=1;
run;

使用相同的1个变量和0个观察值创建另一个集合。

data emptyset;
set fullset;
stop;
run;

创建一个打开set的宏,检查vtype并将其打印到日志。

%macro mwe(inset);  
%local TYPE;

data _NULL_;
set &inset.;
CALL SYMPUT("TYPE", VTYPE(myvar));
put TYPE;
stop;
run;

%put &=TYPE.;
%mend mwe;

当在观察集上运行时,一切正常:

%mwe(fullset);
TYPE=N

但是当使用空集运行时,TYPE不会被分配

%mwe(emptyset);
TYPE=

我想原因是没有处理代码行,因为该集合没有观察结果。有没有解决办法?

注意:使用proc内容并解析结果表对于这样一个简单的任务肯定是一种过度杀伤

2 个答案:

答案 0 :(得分:2)

您的问题不是vtype(),而是数据步骤如何与空数据集一起使用。

当set语句尝试拉行并失败时,数据步骤会立即终止。这可能很有用 - 例如,当您不希望它在数据集的最后一行过去之后执行操作时。但在这种情况下,它没那么有用。您的datastep会立即在set语句中终止,这意味着您的call symput永远不会发生。

但是,您可以利用不同的东西:在编译期间,SAS甚至可以在set之前愉快地创建所有元数据。

%macro mwe(inset);  
%local TYPE;

data _NULL_;
CALL SYMPUT("TYPE", VTYPE(myvar));
set &inset.;
stop;
run;

%put &=TYPE.;
%mend mwe;

注意我在call symput之前移动了set。是的,vtype()即使在设置之前也能正常工作 - 即使在数据步骤中发生任何事情之前,变量仍然在PDV中定义。

(我还拿出了假的put语句,它永远不会做任何事情,因为在任一版本中都没有创建TYPE变量。)

答案 1 :(得分:2)

另一种方法是使用vartype函数,它不需要set语句,并且与vtype函数不同,可以在数据步骤之外的纯宏代码中使用(不需要求{ {1}}等。)

在实践中,这一切意味着您可以使用dosubl制作vartype的函数式宏版本,如下所示:

vtype