在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内容并解析结果表对于这样一个简单的任务肯定是一种过度杀伤
答案 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