【问题标题】:SAS - Assign Library before Macro ConditionalsSAS - 在宏条件之前分配库
【发布时间】:2017-08-20 17:58:15
【问题描述】:

我在宏中的条件逻辑和分配库时遇到问题...

我的问题: 我在分配库之前执行了条件宏逻辑 (%IF/%THEN %DO) 语句,该逻辑基于库中的数据集是否存在。

我仍在学习如何使用 SAS 中的宏,但不确定如何确保首先分配我的库...

我的程序看起来像这样:

%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;是假的,然后再分配库。

如何确保始终先执行 Libname 语句?

【问题讨论】:

  • 我没有关注。如所写,libname 语句应始终在 %DO 块中的任何代码之前执行。也许发布您的日志。如果您有 MLOGIC 选项,则日志消息可能会令人困惑。如果您设置选项 MPRINT NOSYMBOLGEN NOMLOGIC SAS 语句的顺序应该是明确的。
  • @Quentin 宏语法总是在任何 SAS 代码之前解决/执行......我认为这确实是 OP 的问题所在(结合 RSUBMIT 固有的复杂性)。

标签: sas sas-macro


【解决方案1】:

您的问题是本地宏处理器在将宏语法交给 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/等等价物)将要处理的代码。所以如果你想让它处理%if [something] 它必须是inside 一个宏。所以你真正需要的是:

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;

正如 Tom 在 cmets 中向 this answer 指出的那样,这并不总是安全的 - 提交宏可能很危险,因为它并不总是被正确解析 - 所以请谨慎行事,也许考虑一下是否可以在另一种不使用宏语言的方法,或者%includeing 来自 SAS/CONNECT 服务器上的文件的宏。

【讨论】:

  • 您是否建议将我的 sas 宏 - %MyProg() 保存到我的远程服务器上,然后在我连接后使用 RSUBMIT 和 %INCLUDE 语句让 SAS 编译?
  • 是的。如果这更容易,您也可以使用 AUTOCALL 宏目录。所以你有一个文件myprog.sas 位于服务器上,你可以把它放在自动调用目录中然后只是rsubmit; %myprog; endrsubmit;rsubmit; %include //path/to/myprog.sas; %myprog; endrsubmit;`.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
相关资源
最近更新 更多