【问题标题】:SAS Macro if then elseSAS 宏 if then else
【发布时间】:2013-06-06 19:37:58
【问题描述】:

我是 SAS 新手,想创建一个宏程序,为以后的 PROC GPLOT 创建 y 轴值。

用简单的英语来说,这个图表上有两个可能的最小值(和最大值)。轴范围取决于哪个最小值最小。否则,SAS 将不会显示轴范围之外的数据。我不希望 SAS 自动为我创建范围。我想自己定义范围。

所以,这是我对以下过程的尝试:a) 计算两个最小值,b) 比较两者,c) 将两者中的较小者存储在一个新的宏变量中。如果我能让这个工作,一个最大的程序将很容易做到。

%MACRO min;
%LET ymin1 = %SYSEVALF(&minresult - (((&minresult + &maxresult)/2) * .05);
%PUT ymin1 = &ymin1;
%LET ymin2 = %SYSEVALF(&min - (&min * .05));
%PUT ymin2 = &ymin2;
%IF &ymin1 > &ymin2
%THEN %LET ymin = ymin2;
%ELSE %LET ymin = ymin1;
%PUT ymin = &ymin;
%MEND min;

我感觉我在语法上做错了什么。任何帮助表示赞赏。

【问题讨论】:

  • 一些注意事项 - 没有宏程序之类的东西; macro 是术语本身。 PROC FCMP 允许您创建函数和过程,但它们不是使用宏语言 - 而是使用接近数据步骤语言的东西。此外,您应该将 &min/&minresult/&max/&maxresult 定义为宏参数;即使它们作为全局宏变量存在,最好再次定义它们。您仍然可以调用 %min(&min,&max,&minresult,&maxresult) 并且它会正常工作。

标签: sas sas-macro


【解决方案1】:

简单的解决方案是跳过 %if 内容,只从 ymin1/2 定义 ymin:

%let ymin = %sysfunc(min(&ymin1,&ymin2));

除了第一个 ymin 声明中缺少的 ) 之外,您遇到的特定语法错误是 %let ymin = ymin2; 应该是 %let ymin=&ymin2;。否则它只包含文本“ymin2”,而不是宏变量的内容。

整个宏:

%MACRO min(minresult,maxresult,min,max);
%LET ymin1 = %SYSEVALF(&minresult - (((&minresult + &maxresult)/2) * .05));
%PUT ymin1 = &ymin1;
%LET ymin2 = %SYSEVALF(&min - (&min * .05));
%PUT ymin2 = &ymin2;
%let ymin = %sysfunc(min(&ymin1,&ymin2));
%PUT ymin = &ymin;
%MEND min;

%min (5,6,3,4);

【讨论】:

  • 在这种情况下,%sysfunc 调用的 min( ) 是 SAS min 函数,除了名称和用途之外,与您的宏没有任何关系。如果您定义了 ymin1/ymin2 和/或在 sysfunc 调用中构造它们,您也可以在开放代码中执行此操作。如果你在那里做了,你就不必使用 SYSEVALF。
  • 你说得对,%sysfunc 确实让这变得容易多了。但是,现在我收到“错误:检测到打开代码语句递归”。
  • 你能重写程序吗?
  • 最常见的开放代码递归意味着您在某处遗漏了分号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多