SAS-在宏条件之前指定库
我在宏中的条件逻辑和分配库时遇到问题 我的问题: 在分配库之前,我有条件宏逻辑(%IF/%THEN%DO)语句正在执行,该逻辑基于库中是否存在数据集 我仍在学习SAS中的宏,不知道如何确保首先分配我的库 我的程序如下所示:SAS-在宏条件之前指定库,sas,sas-macro,Sas,Sas Macro,我在宏中的条件逻辑和分配库时遇到问题 我的问题: 在分配库之前,我有条件宏逻辑(%IF/%THEN%DO)语句正在执行,该逻辑基于库中是否存在数据集 我仍在学习SAS中的宏,不知道如何确保首先分配我的库 我的程序如下所示: %MACRO MyProg(); SIGNON... RSUBMIT.... LIBNAME TEMP "My.Qualifiers.To.Location" Disp=shr; %IF %SYSFUNC(EXIST(TEMP.FILE))
%MACRO MyProg();
SIGNON...
RSUBMIT....
LIBNAME TEMP "My.Qualifiers.To.Location" Disp=shr;
%IF %SYSFUNC(EXIST(TEMP.FILE)) %THEN %DO;
....some datasteps....
%END;
ENDRSUBMIT;
SIGNOFF;
%MEND;
%MyProg();
我可以从日志中看到%IF&SYSFUNC(EXIST(TEMP.FILE))%THEN%DO
为false,然后分配库
如何确保始终首先执行Libname语句?您的问题是,本地宏处理器在将宏语法交给SAS/CONNECT服务器之前正在处理宏语法。因此,当执行
%MyProg()
时,首先会发生什么,其中的所有文本都被视为文本并进行处理-返回以下内容:
SIGNON...
RSUBMIT....
LIBNAME TEMP "My.Qualifiers.To.Location" Disp=shr;
....maybe some datasteps or not depending on what happened _locally_ with %if ....
ENDRSUBMIT;
SIGNOFF;
这是正确的行为,通常非常有用。在很多情况下,您可能希望根据本地内容提交不同的RSUBMIT代码块。然而,这不是你想要的
您需要使用宏引用,以防止在您希望宏解析之前解析该宏。我不能100%确定这里的时间,但我认为%nrbquote
可能是正确的报价函数
但是,您还有一个问题,%IF
需要位于远程计算机上的宏中。请记住,RSUBMIT
所做的是提交另一个SAS.EXE(或unix/vax/etc.等效程序)将要处理的代码。因此,如果你想让它在[something]中处理%,它必须在宏中。所以你真正需要的是:
SIGNON;
RSUBMIT;
%MACRO MyProg();
LIBNAME TEMP "My.Qualifiers.To.Location" Disp=shr;
%IF %SYSFUNC(EXIST(TEMP.FILE)) %THEN %DO;
....some datasteps....
%END;
%MEND;
%MyProg();
ENDRSUBMIT;
SIGNOFF;
正如汤姆在评论中所指出的,这并不总是安全的——提交宏可能是危险的,因为它不总是正确解析的,所以请小心地对待这一点,并考虑是否可以用另一种方式来处理,而不是使用宏语言。或
%包括从驻留在SAS/CONNECT服务器上的文件中删除宏。我不明白。如前所述,libname语句应始终在%DO块中的任何代码之前执行。也许把你的日志发出去。如果您有选项MLOGIC,那么日志消息可能会令人困惑。如果您设置选项MPRINT NOSYMBOLGEN NOMLOGIC,SAS语句的顺序应该是清楚的。@Quentin宏语法总是在任何SAS代码。。。我认为这正是OP的问题所在(再加上RSUBMIT固有的复杂性)。您的建议是将我的sas宏-%MyProg()保存到远程服务器上,然后使用RSUBMIT和%INCLUDE语句,以便sas在连接后进行编译吗?是的。如果方便的话,还可以使用AUTOCALL宏目录。因此,您在服务器上有一个文件myprog.sas
,您可以将其放入自动调用目录,然后只rsubmit;%myprog;endrsubmit代码>或rsubmit;%包括//path/to/myprog.sas代码>%myprog;endrsubmit;`。