在年份列表中执行宏
Executing a macro over a list of years
我已经为这个问题苦苦挣扎了一段时间。我写了一个宏,我们称之为 macro1
,我想在年份列表中 运行 假设 1989 1990 1995
使用 do
或 %do
循环打开代码 但我无法让它工作。我一直在尝试
%let years = 1989 1990 1995
%local i next_year
%do i=1 %to %sysfunc(%countw(&years));
next_year = %scan(&years, &i);
%macro1(&next_year);
%end
无济于事。有没有人有解决这个问题的方便方法?这似乎是另一种编程语言能够在 3 行中完成的事情(我必须使用 SAS,尽管它是唯一可用的语言)。任何帮助都会很棒。
如果包含创建宏变量所需的 %LET
,则您的代码可以在宏定义中运行。并用所需的分号终止你的陈述。也不要使用您不需要的分号。
%macro test(years);
%local i next_year;
%do i=1 %to %sysfunc(%countw(&years));
%let next_year = %scan(&years, &i);
%macro1(&next_year)
%end;
%mend test;
%test(1989 1990 1995)
您也可以完全删除不需要的 NEXT_YEAR 变量。
%macro1(%scan(&years, &i))
真的,你应该避免使用宏编码。坚持先学习如何编写实际的 SAS 代码。等到知道要生成什么代码后,再学习如何使用宏生成代码。使用数据步骤的真实语言创建复杂的 DO 循环要容易得多,而不是尝试在宏处理器中编写代码。
data _null_;
do year=1989, 1990, 1995 ;
call execute(cats('%nrstr(%macro1)(',year,')'));
end;
run;
但有时壁纸代码比过于复杂的事情更容易。这是三行程序。
%macro1(1989)
%macro1(1990)
%macro1(1995)
我已经为这个问题苦苦挣扎了一段时间。我写了一个宏,我们称之为 macro1
,我想在年份列表中 运行 假设 1989 1990 1995
使用 do
或 %do
循环打开代码 但我无法让它工作。我一直在尝试
%let years = 1989 1990 1995
%local i next_year
%do i=1 %to %sysfunc(%countw(&years));
next_year = %scan(&years, &i);
%macro1(&next_year);
%end
无济于事。有没有人有解决这个问题的方便方法?这似乎是另一种编程语言能够在 3 行中完成的事情(我必须使用 SAS,尽管它是唯一可用的语言)。任何帮助都会很棒。
如果包含创建宏变量所需的 %LET
,则您的代码可以在宏定义中运行。并用所需的分号终止你的陈述。也不要使用您不需要的分号。
%macro test(years);
%local i next_year;
%do i=1 %to %sysfunc(%countw(&years));
%let next_year = %scan(&years, &i);
%macro1(&next_year)
%end;
%mend test;
%test(1989 1990 1995)
您也可以完全删除不需要的 NEXT_YEAR 变量。
%macro1(%scan(&years, &i))
真的,你应该避免使用宏编码。坚持先学习如何编写实际的 SAS 代码。等到知道要生成什么代码后,再学习如何使用宏生成代码。使用数据步骤的真实语言创建复杂的 DO 循环要容易得多,而不是尝试在宏处理器中编写代码。
data _null_;
do year=1989, 1990, 1995 ;
call execute(cats('%nrstr(%macro1)(',year,')'));
end;
run;
但有时壁纸代码比过于复杂的事情更容易。这是三行程序。
%macro1(1989)
%macro1(1990)
%macro1(1995)