【问题标题】:how to correct SAS error about positional parameters macro variables如何纠正有关位置参数宏变量的 SAS 错误
【发布时间】:2017-06-26 07:19:10
【问题描述】:

如果每个列表中有多个东西,这段代码将无法正确运行。

%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。如果我按照注释部分中的方式进行循环,则代码不会运行,我似乎无法弄清楚原因。谢谢!

【问题讨论】:

  • 与您的错误无关,但最好添加 run; 语句来结束您的 DATA 步骤。
  • 因为您告诉 %SCAN() 您的列表由单引号分隔,所以您的示例在每个列表中只有一个项目。这意味着嵌入该项目的空间会使您的宏生成无效的 SAS 代码。此外,宏的整体逻辑也存在缺陷,因为如果列表中有多个项目,它只会继续覆盖相同的输出数据集。宏的总体目标是什么?
  • @Tom 感谢您指出我添加了 a_&I 来解决覆盖问题。在我的真实程序中,该程序的目标是同时迭代两个列表。这样我就可以拿出一张我需要的桌子。现在我已经弄清楚了,我需要弄清楚如何附加所有创建的表。

标签: parameters macros sas


【解决方案1】:

尝试将%scan 中的第三个参数从'' 更改为%str( )。目前它正在您的输入列表中寻找 ' 分隔符,因为在 SAS 宏语言中,所有内容都是文本,您不需要像在过程和数据步骤中那样引用字符常量。但是,您不能只键入不带引号的空格,因为宏处理器会修剪所有内容,因此您必须使用适当的宏引用函数之一。

您可能还想查看 SAS 中数组的文档,因为这通常是在数据步骤中多次运行计算的更简单的选项。

【讨论】:

  • 感谢您的帮助!我还在声明变量材料的行上添加了一个分号。在 %mend; 之后还添加了 run 语句。我只是想知道 arrays 选项在运行时会更快吗?谢谢!
【解决方案2】:

确保对 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 观察值的数据集,那么您可能不需要使用 %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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    相关资源
    最近更新 更多