如果每个列表中有多个内容,则这段代码将无法正常运行。
%macro loop(list1, list2);
%let n=%sysfunc(countw(&list1));
%do i=1 %to &n;
%let O_list1 = %scan(&list1, &i, '');
%let O_list2 = %scan(&list2, &i, '');
data taxes;
food=3*&O_List1;
materials = 4*&O_List2
%end;
%mend;
%loop(1, 4);
/* %loop(1 3, 4 6) */
这里的输出是3和16.如果我按照注释部分进行循环,代码就不会运行,我似乎无法找出原因。谢谢!
答案 0 :(得分:2)
尝试将%scan
中的第三个参数从''
更改为%str( )
。目前,它正在输入列表中查找'
分隔符,因为在SAS宏语言中,所有内容都是文本,您不需要像在proc和数据步骤中那样引用字符常量。但是,您不能只键入一个不带引号的空格,因为宏处理器会修剪所有内容,因此您必须使用适当的宏引用函数之一。
您可能还想查看SAS中的数组文档,因为这通常是在数据步骤中多次运行计算的更简单选项。
答案 1 :(得分:0)
确保对COUNTW()和%SCAN()函数调用使用相同的分隔符。请记住,宏处理器引号是字符串的一部分,并且要在值的开头或结尾包含空格,您需要宏引用它。
%let n=%sysfunc(countw(&list1,%str( )));
%do i=1 %to &n;
%let item1 = %scan(&list1, &i, %str( ));
%let item2 = %scan(&list2, &i, %str( ));
如果您的列表实际上只是用于创建带有&n; N个观察值的数据集,那么您可能不需要使用%DO或%SCAN()。
%macro taxes(list1, list2);
%local n ;
%let n=%sysfunc(countw(&list1));
data taxes;
array _1 (&n) _temporary_ (&list1);
array _2 (&n) _temporary_ (&list2);
do row=1 to &n ;
food=3*_1(row);
materials = 4*_2(row);
output;
end;
run;
%mend;
%taxes(list1=1 3, list2=4 6);
proc print data=taxes;
run;