运行 RSUBMIT 中的本地宏 SAS/CONNECT

Run local macro in RSUBMIT SAS/CONNECT

这是一个与 here 中类似的问题,但使用的是 OPTIONS MSTORED SASMSTORE。 问题是将函数存储在库实用程序中,并在 RSUBMIT 语句中调用它们。最小代码如下:

LIBNAME utils 'path/to/utils';
OPTIONS MSTORED SASMSTORE=utils;

%MACRO foo() / STORE;
*sas code;
%MEND foo;

%MACRO run_foo_parallel() / STORE;
options sascmd="sas"
SIGNON task;
RSUBMIT task;
%foo();
ENDRSUBMIT;
WAITFOR _all_;
SIGNOFF _all_;
%MEND;

在我的实际问题中,我一次在多个数据集中并行化 运行 foo()。我不知道如何告诉 SAS 识别 %foo();在正确的 utils 文件夹中。我考虑过的事情:

任何帮助都是有价值的! “简单的技巧”是在没有 STORE 选项的 RSUBMIT 中写入 foo(),但这似乎不是最佳实践。

谢谢大家

您不能 运行 在一个会话中定义的宏在另一个会话中。因此,使宏可用于两个会话。您已使用这两行使 %foo() 可用。

LIBNAME utils 'path/to/utils';
OPTIONS MSTORED SASMSTORE=utils;

因此 运行 在尝试调用宏之前远程会话中的那些行。

SIGNON task;
RSUBMIT task;
  LIBNAME utils 'path/to/utils';
  OPTIONS MSTORED SASMSTORE=utils;
  %foo();
ENDRSUBMIT;

确保远程会话中使用的路径在会话 运行ning 中有效。可能您可以上传已编译的宏目录,类似于您链接的主题中的文件上传。但这需要删除会话使用相同版本的 SAS,以便目录可读。

由于您似乎是将其用于并行处理,而不是实际连接到某些实际上是远程的 SAS 服务器,因此您只需设置用于启动 SAS 的命令即可自动设置搜索路径,然后使用!启动并行会话的 sascmd 应该产生相同的设置。

所以将这两个设置行放在您的 AUTOEXEC(或配置文件或 -initstmt 命令行选项等)中,以便它们 运行 在您的实际程序中的代码之前。然后,当您使用以下命令启动并行会话时:

signon task cmd='!sascmd';

他们也会运行。所以现在两个会话都有相同的一组可用的定义宏。