我想将宏存储在目录中。这样做允许多个宏仅在一个文件中共享,并在一定程度上与用户分离。
为了存储我的宏,我运行一个程序,例如
/* HelloWorld.sas */
libname pwd "."; /* assign current directory */
option mstored sasmstore=pwd; /* set pwd as storage directory */
%macro HelloWorld()
/ store source; /* store compiled macro along with its source */
data _null_;
put "Hello, World!";
run;
%mend;
这会在 HelloWorld.sas
所在的目录中创建一个 sasmacr.sas7bcat
文件。然后,我可以将该文件移动到另一个目录,例如 C:\myMacros
并运行以下程序:
/* CallHelloWorld.sas */
libname myMacros 'C:\myMacros';
option mstored sasmstore=myMacros;
%HelloWorld();
调用宏 HelloWorld()
时没有错误。
但是,如果我想将 HelloWorld()
宏视为“HelloWorld”宏套件的一部分,我不能简单地将 Windows 资源管理器中的目录名称从 sasmacr.sas7bcat
到 HelloWorld.sas7bcat
。当我执行此操作并尝试再次运行 CallHelloWorld.sas 时(关闭并重新打开 SAS 后),宏未解析。
1 /* CallHelloWorld.sas */
2 libname myMacros 'C:\myMacros';
NOTE: Libref MYMACROS was successfully assigned as follows:
Engine: V9
Physical Name: C:\myMacros
3 option mstored sasmstore=myMacros;
4
5 %HelloWorld();
-
180
NOTE: The SAS System was unable to open the macro library referenced by the SASMSTORE = libref
MYMACROS.
WARNING: Apparent invocation of macro HELLOWORLD not resolved.
ERROR 180-322: Statement is not valid or it is used out of proper order.
ERROR: Catalog MYMACROS.SASMACR does not exist.
NOTE: The SAS System was unable to open the macro library referenced by the SASMSTORE = libref
MYMACROS.
ERROR: An error occurred during the execution of the %COPY statement.
如何更改包含宏的目录的名称,以便可以在各种程序中调用这些宏?是否可以预先将目录命名为与 sasmacr
不同的名称?
最佳答案
至少在带有 SAS 9.4 的 Unix 上,您可以使用 SASAUTOS 选项来指向使用 ZIP 引擎的 FILEREF,以便所有宏定义都存储在单个 ZIP 文件中。
一个“技巧”是您需要更改 ZIP 文件中成员文件的名称。通常,在 unix 上,SASAUTOS 要求使用小写的宏名称和 .sas
扩展名 (helloworld.sas
) 来命名源文件。但要使 SASAUTOS 使用 ZIP 文件,应使用大写的宏名称来命名成员,不带扩展名 (HELLOWORLD
)。
filename mymacros zip '~/mymacros.zip';
options insert=(sasautos=(mymacros)) ;
编辑
不幸的是,当在 ZIP 文件中找不到宏源文件时,此方法会导致 SAS 生成 ERROR: 消息,即使最终在 SASAUTOS 选项搜索路径中的另一个文件中找到它。
关于macros - SAS:重命名宏目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40249484/