【发布时间】:2021-08-30 17:08:30
【问题描述】:
我正在尝试从 SAS 宏中索引增加的宏变量创建变量,但我得到变量 aa_index 的缺失值,并且我得到 bb_index 的 0 值,这不应该是这种情况。请帮助我如何调整我的宏以正常工作。我的 SAS 宏如下所示;
%macro cashflow_macro(index=,aa_1=,aa_2=,aa_3=,aa_4=,);
/*create bb fields*/
%put bb_1 = &aa_&index - &aa_(&index+1);
%put bb_2 = &aa_(&index+1) - &aa_(&index+2);
%put bb_3 = &aa_(&index+2) - &aa_(&index+3);
/*create cc fields*/
cc_1 = max(bb_1,0);
cc_2 = max(bb_2,0);
cc_3 = max(bb_3,0);
%mend;
data ccc;
%cashflow_macro(index=1,aa_1=400,aa_2=300,aa_3=250,aa_4=270);
run;
【问题讨论】:
-
请提供一个示例,说明您如何使用指定的参数调用宏,以及我假设的数据步骤?
-
对于初学者,您的
bb_##引用应该以 & 开头,表示它们是宏变量。您还需要%eval或%sysevalf使您的增量(&index+8)正常工作,我怀疑您需要删除括号()。诸如 cc_24 之类的赋值在开放代码中没有意义,因此您的代码存在许多问题。在不知道您要达到的目标的情况下,我不确定从哪里开始修复。并且%PUT显示不是它创建的变量。我认为您需要 %LET。 -
只使用 4 个 aa_ 变量创建一个简化版本,并向我们展示您希望从宏调用中生成的 SAS 代码。现在这有很多问题,但由于这些问题,它应该是什么还不清楚。
-
这是一个简化的例子,我创建宏然后调用它; %macro cashflow_macro(index=,aa_1=,aa_2=,aa_3=,aa_4=,); /*创建bb字段*/ %put bb_1 = &aa_&index - &aa_(&index+1); %put bb_2 = &aa_(&index+1) - &aa_(&index+2); %put bb_3 = &aa_(&index+2) - &aa_(&index+3); /*创建 cc 字段*/ cc_1 = max(bb_1,0); cc_2 = 最大值(bb_2,0); cc_3 = max(bb_3,0); %修补;数据cc; %cashflow_macro(index=1,aa_1=400,aa_2=300,aa_3=250,aa_4=270);运行;
-
请显示您希望通过此宏调用生成的 SAS 代码(没有宏变量引用):
%cashflow_macro(index=1,aa_1=400,aa_2=300,aa_3=250,aa_4=270);