SAS:数据步骤中的宏过程错误

时间:2015-10-02 12:35:05

标签: macros sas datastep

我无法找到此错误的解决方案。我尝试使用%eval,%sysfunc和%sysevalf,但没有成功。正确评估宏中的“& set”需要什么?

%macro set_istituzionale(set=, varout=);
  %if &set/100 = 1 %then &varout = 'AP';
%mend set_istituzionale;

data soff2; set soff; %set_istituzionale(set=setcon,varout=set); run;

ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was:
       &set/100 = 1
ERROR: The macro SET_ISTITUZIONALE will stop executing.

1 个答案:

答案 0 :(得分:1)

你背后的逻辑是错误的。

您在datastep中调用该宏,因此该宏应该包含可以在datastep中解析的内容(语句)。

if-else不会用宏语言编写,而是用普通的datastep语言编写。

%macro set_istituzionale(set=, varout=);
  if &set/100 = 1 then &varout = 'AP';
%mend set_istituzionale;

现在,如果您使用通话,您将以这种方式解决您的datastep:

data soff2; 
set soff;
%set_istituzionale(set=setcon,varout=set);
run;

将成为:

data soff2; 
set soff;
if setcon/100 = 1 then set = 'AP';
run;

在你的代码中,你使用宏代码,所以你的步骤在内部被解析为宏布尔语句%if& set / 100 resolve is%if if setcon / 100其中setcon是一个字符串(这里我们有条件地说宏语言,写变量的名称将不会捕获变量的值'因为它完全独立于datastep。)

你应该只考虑宏语言为你写下代码的东西,例如你的第一次尝试可以用来有条件地插入一个宏变量的值,如:

data try;
set want;

%if &macrovar=A %then %do;
if var1=1 and var2='B' then var3='C';
%end;

%if &macrovar=B %then %do 
if var1=2 and var2='A' then var3='D';
%end;

run;

when the macro variable macrovar will be = A the step will be:

data try;
set want;
if var1=1 and var2='B' then var3='C';
run;

if the macro variable macrovar will be = B the step will be:

data try;
set want;
if var1=2 and var2='A' then var3='D';
run;

但是您也可以在datastep外部使用宏代码,例如,有条不紊地执行datastep或其他内容到宏变量的值:

%if &macrovar=A %then %do;

data try; set tr;
some code;
run;

%end;

%else %if &macrovar=B %then %do;

proc sort data=tr out=try nodupkey; by var1; run;

%end;