如何纠正有关位置参数宏变量的SAS错误

时间:2017-06-26 07:19:10

标签: parameters macros sas

如果每个列表中有多个内容,则这段代码将无法正常运行。

%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.如果我按照注释部分进行循环,代码就不会运行,我似乎无法找出原因。谢谢!

2 个答案:

答案 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;

enter image description here