sas - 每次调用宏时如何告诉 SAS 编译宏而不是手动编译
问题描述
上下文:我们使用SAS 9.4
and Enterprise Guide 7.15
。目前,我们正在实施一些新的宏,当然必须在此过程中进行很多更改。有时更小,有时更大的变化。问题是,为了使更改生效,SAS
需要我们手动编译宏代码或重新启动会话,这有点乏味。
这是我们主文件中的当前设置(调用所有宏):
/* Macro options */
MAUTOSOURCE sasautos = "<path to macro>" mlogic mlogicnest mprint mprintnest MRECALL
是否有可能在使用该MAUTOSOURCE */ sasautos =""
选项时告诉SAS
每次调用宏以实际编译宏而不是使用会话存储的宏?理想情况下,只有在执行主文件(等)中的整行代码时才会编译宏MAUTOSOURCE */ sasautos =""
,否则它应该在会话中保留已编译的版本。
我发现这篇论文(The Autocall Macro Facility in the SAS for Windows Environment)在结论中指出
之后 SAS 将使用已经编译的代码。如果对宏进行了更改,则必须在更改生效之前再次对其进行编译。
我希望这并不意味着我必须手动完成。是否有任何宏选项可以设置?
解决方案
在 SAS 9.3 中,他们添加了%SYSMACDELETE
宏功能。因此,如果您只想让自动调用重新定义单个宏,然后使用它来删除当前定义。
%symacdelete mymacro;
这是一个实用宏,它将查询 SASHELP.VCATALG 视图以在 WORK 库中查找已编译的宏并将其删除。它具有列出要删除或保留的宏名称的选项。请注意,普通 SAS 会话使用 WORK.SASMACR 来存储已编译的宏。但是 SAS/Studio 和 EG(可能还有其他运行 SAS 的方式)使用 WORK.SASMAC1 代替。
https://github.com/sasutils/macros/blob/master/macdelete.sas
%macro macdelete(delete,keep);
/*----------------------------------------------------------------------------
Remove compiled macros using %SYSMACDELETE macro statement.
Use DELETE parameter to list macro names to delete.
Use KEEP parameter to list macro names to NOT delete.
Calling it with no values will delete all macros not currently running.
----------------------------------------------------------------------------*/
%local libname memname objname objtype fid i;
%do i=1 %to %sysmexecdepth;
%let keep=%sysmexecname(&i) &keep;
%end;
%if %length(&delete) %then %let delete=and findw("&delete",objname,',','sit');
%let fid=%sysfunc(open( sashelp.vcatalg(keep=libname memname objname objtype
where=(libname='WORK' and objtype='MACRO' and memname like 'SASMAC_'
and not findw("&keep",objname,',','sit') &delete))));
%if (&fid) %then %do;
%syscall set(fid);
%do %while(0=%sysfunc(fetch(&fid)));
%put %sysfunc(compbl(Removing &objname from &libname catalog &memname));
%sysmacdelete &objname;
%end;
%let fid=%sysfunc(close(&fid));
%end;
%else %put %qsysfunc(sysmsg());
%mend macdelete;
例子:
3348 %macro test1; %mend;
3349 %macro test2; %mend;
3350 %macro test3; %mend;
3351 %macro test4; %mend;
3352 %macdelete(test1 test3);
Removing TEST1 from WORK catalog SASMACR
Removing TEST3 from WORK catalog SASMACR
3353 %macdelete(keep=test2);
Removing TEST4 from WORK catalog SASMACR
运行 SAS/Studio 或 Enterprise Guide 时的示例:
97 %macro test1; %mend;
98 %macro test2; %mend;
99 %macro test3; %mend;
100 %macro test4; %mend;
101 %macdelete(test1 test3);
Removing TEST1 from WORK catalog SASMAC1
Removing TEST3 from WORK catalog SASMAC1
推荐阅读
- php - 如何根据下面给出的类别示例显示数据库中的数据
- python - 如何获取每个用户的未读消息?
- react-native - 无法在我的屏幕的 Appbar 上叠加图像。(React-Native, react-native-paper)
- shodan - 在 Shodan 中搜索版本范围
- java - 我收到错误“线程“主”java.lang.ArrayIndexOutOfBoundsException: 2 at com.company.Main.main(Main.java:21) 中的异常”
- javascript - 带有 Firebase 通知的 Flutter Web - subscribeToTopic
- php - Laravel - 从空值创建默认对象
- python - 在 QLineEdit 中接受一个用户输入后,如何获得新的用户输入?
- python - 'decimal.Decimal' 对象不可迭代 django 发生错误
- python - pandas plot ylabel 特征名称不适合