首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAS -将宏传递给宏

SAS -将宏传递给宏
EN

Stack Overflow用户
提问于 2017-06-22 23:45:59
回答 2查看 161关注 0票数 1

有没有办法将宏作为参数传递给宏?

就像这样

代码语言:javascript
复制
%macro outer_macro(macro);
  %do i=1 %to 5;
     &macro
  %end;
%mend outer_macro;

%macro inner_macro;
  /* do something usefull */
%mend inner_macro;

%outer_macro(%inner_macro)

当然,这个示例不起作用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-22 23:53:14

您可以使用宏引用来实现这一点。

示例的一个简单版本:

代码语言:javascript
复制
%macro outer_macro(macro);
  %put Starting outer macro;
     %unquote(&macro)  /* %unquote removes the NRSTR escape characters */
  %put Ending outer macro;
%mend outer_macro;

%macro inner_macro;
  %put Starting inner macro;
  proc print data=sashelp.class;
  run;
  %put Ending inner macro;
%mend inner_macro;

%outer_macro(%nrstr(%inner_macro)) /* %nrstr is execution-time quoting, so %inner_macro is passed and not treated as a macro until %unquote removes the quoting */

要涉及像循环这样的东西,只需确保一切都设置为使用循环迭代器-一种方法是简单地将()附加到循环中。

代码语言:javascript
复制
%macro outer_macro(macro);
  %put Starting outer macro;
    %do i = 1 %to 19;
       %unquote(&macro)(n=&i.)  /* resolves to %inner_macro(n=&i.) */
    %end;
  %put Ending outer macro;
%mend outer_macro;

%macro inner_macro(n=);
  %put Starting inner macro;
  proc print data=sashelp.class(obs=&n. firstobs=&n.);
  run;
  %put Ending inner macro;
%mend inner_macro;

%outer_macro(%nrstr(%inner_macro))
票数 6
EN

Stack Overflow用户

发布于 2017-06-23 00:43:24

为什么不直接按名称传递宏呢?

代码语言:javascript
复制
%macro outer_macro(macro);
  %put Starting &sysmacroname - MACRO=%superq(macro);
     %&macro
  %put Ending &sysmacroname;
%mend outer_macro;

%macro inner_macro(dsn);
  %put Starting &sysmacroname - &=dsn;
  proc print data=&dsn;
  run;
  %put Ending &sysmacroname;
%mend inner_macro;

%outer_macro(inner_macro(sashelp.class)) ;

打开MPRINT的结果日志。

代码语言:javascript
复制
Starting OUTER_MACRO - MACRO=inner_macro(sashelp.class)
Starting INNER_MACRO - DSN=sashelp.class
MPRINT(INNER_MACRO):   proc print data=sashelp.class;
MPRINT(INNER_MACRO):   run;

NOTE: There were 19 observations read from the data set SASHELP.CLASS.
NOTE: PROCEDURE PRINT used (Total process time):
      real time           0.04 seconds
      cpu time            0.00 seconds


Ending INNER_MACRO
Ending OUTER_MACRO
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44704070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档