【问题标题】:SAS: How do I Store a Macro in a CatalogSAS:如何在目录中存储宏
【发布时间】:2016-09-15 14:24:52
【问题描述】:

这是previous post 的后续问题。除了我原始帖子中引用的资源之外,我还尝试将宏存储在这些文章中概述的目录中:

这是我目前所做的:

我创建了一个目录“C:\myMacros”。首先,我创建了一个名为“HelloWorld.sas”的程序,其中包含以下代码:

/* HelloWorld.sas */
option mstored sasmstore=mymacros;
libname myMacros 'C:\myMacros';

%macro HelloWorld() / store source;
    data _null_;
        put "Hello, World!";
    run;
%mend;

代码使用以下日志条目执行:

1    option mstored sasmstore=mymacros;
2    libname myMacros 'C:\myMacros';
NOTE: Libref MYMACROS was successfully assigned as follows:
      Engine:        V9
      Physical Name: C:\myMacros
3
4    %macro HelloWorld() / store source;
5        data _null_;
6            put "Hello, World!";
7        run;
8    %mend;

在 SAS 文件资源管理器中,已创建活动库“Mymacros”,其中驻留目录名为“Sasmacr”。在 Windows 资源管理器中检查,我看到“C:\myMacros\sasmacr.sas7bcat”已创建。在 SAS File Explorer 中,我点击“Sasmacr”目录,在里面找到“Helloworld”。当我双击它时,我得到消息框说,

宏数据类型没有默认操作。

因此,我得出结论,该宏已编译并存储在“Sasmacr”目录中。我关闭 SAS 以清除所有内存。

现在,我尝试调用宏。我打开一个新的 SAS 会话并创建一个名为“CallHelloWorld1.sas”的新程序,其中包含以下代码:

/* CallHelloWorld1.sas */
libname myMacros 'C:\myMacros';
filename myCat catalog 'mymacros.sasmacr.helloworld.source';
%include myCat;

%HelloWorld();

这会在%include 语句中生成错误。

1    /* CallHelloWorld1.sas */
2    libname myMacros 'C:\myMacros';
NOTE: Libref MYMACROS was successfully assigned as follows:
      Engine:        V9
      Physical Name: C:\myMacros
3    filename myCat catalog 'mymacros.sasmacr.helloworld.source';
4    %include myCat;
ERROR: Physical file does not exist, SOURCE  .
ERROR: Cannot open %INCLUDE file MYCAT.
5
6    %HelloWorld();
     -
     180
WARNING: Apparent invocation of macro HELLOWORLD not resolved.

ERROR 180-322: Statement is not valid or it is used out of proper order.

该错误声称物理文件不存在,这与我在上面的观察相矛盾。因此,我得出结论,我称它不正确。根据FILENAME Statement, CATALOG Access Method,SAS 四部分名称由 library.catalog.entry.entrytype 组成。我的陈述包括

  1. 库:myMacroslibname myMacros 'C:\myMacros'; 定义
  2. 目录:sasmacr
  3. 条目:helloworld
  4. 类型:source

mymacros.sasmacr.helloworld.source。这里肯定有错误,但我无法理解它是什么。

要尝试另一种方法,我再次关闭 SAS 以清除内存。我创建了“CallHelloWorld2.sas”,其中包含以下代码:

/* CallHelloWorld2.sas */
libname myMacros 'C:\myMacros';
filename myCat catalog 'mymacros.sasmacr';
%include myCat(HelloWorld);

%HelloWorld();

这也会在%include 行产生错误:

1    /* CallHelloWorld2.sas */
2    libname myMacros 'C:\myMacros';
NOTE: Libref MYMACROS was successfully assigned as follows:
      Engine:        V9
      Physical Name: C:\myMacros
3    filename myCat catalog 'mymacros.sasmacr';
4    %include myCat(HelloWorld);
ERROR: Entry HELLOWORLD.SOURCE not found in catalog MYMACROS.SASMACR.
ERROR: Cannot %INCLUDE member HelloWorld in the aggregate MYCAT.
ERROR: Entry HELLOWORLD.SOURCE not found in catalog MYMACROS.SASMACR.
ERROR: Cannot %INCLUDE member HelloWorld in the aggregate MYCAT.
5
6    %HelloWorld();
     -
     180
WARNING: Apparent invocation of macro HELLOWORLD not resolved.

ERROR 180-322: Statement is not valid or it is used out of proper order.

看来我的宏没有正确存储或调用不正确。然而,资源严重不足。请帮忙!

【问题讨论】:

    标签: sas sas-macro


    【解决方案1】:
    libname myMacros 'C:\temp';
    
    option mstored sasmstore=mymacros;
    
    %helloWorld()
    

    这就是您需要做的所有事情 - 提醒 SAS 您指向的位置,然后运行宏。你不需要 %include 任何东西。

    【讨论】:

    • 谢谢,但是为什么不将源打印到日志中呢?我尝试将sourcemautosourcesasautos=librefsasmstore=libref 以不同的组合添加到option 语句中,但是宏源代码不会打印到日志中,即使宏与源代码一起保存选项。
    • 阅读您再次发布的那篇文章(“存储方式...”)。 %COPY 最终是你的答案。
    • 当我写 %copy HelloWorld / source; 时,它会将宏源输出到日志中,但 HelloWorld 以红色突出显示,就好像它是一个错误一样。我的语法不正确并且日志输出是一个方便的副作用吗?或者,语法是否正确且 SAS 突出显示是否具有误导性?
    • 语法高亮只是没有 %COPY 宏语句的规则。有许多语法高亮不理解的有效 SAS 命令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    相关资源
    最近更新 更多