SAS:数据步骤中的宏过程错误
SAS: macro procedure error in data step
我找不到解决此错误的方法。我尝试使用 %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.
你宏背后的逻辑是错误的。
您在数据步内调用该宏,因此该宏应包含可在数据步内解析的内容(语句)。
if-else 不会用宏语言编写,而是用普通的数据步骤语言编写。
%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;
会变成:
data soff2;
set soff;
if setcon/100 = 1 then set = 'AP';
run;
在您的代码中,您使用的是宏代码,因此您的步骤在内部解析为宏布尔语句 %if &set/100 resolved were %if setcon/100 其中 setcon 是一个字符串(这里我们是有条件地用宏语言说话,写变量的名称不会捕获变量的值,因为它完全独立于数据步骤)。
您应该只将宏语言考虑为可以为您写下代码的东西,例如您第一次尝试的东西可以用于有条件地将语句插入到宏变量的值中,例如:
data try;
set want;
%if ¯ovar=A %then %do;
if var1=1 and var2='B' then var3='C';
%end;
%if ¯ovar=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;
但是您也可以在数据步之外使用宏代码,例如根据宏变量的值有条件地执行数据步或其他内容:
%if ¯ovar=A %then %do;
data try; set tr;
some code;
run;
%end;
%else %if ¯ovar=B %then %do;
proc sort data=tr out=try nodupkey; by var1; run;
%end;
我找不到解决此错误的方法。我尝试使用 %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.
你宏背后的逻辑是错误的。
您在数据步内调用该宏,因此该宏应包含可在数据步内解析的内容(语句)。
if-else 不会用宏语言编写,而是用普通的数据步骤语言编写。
%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;
会变成:
data soff2;
set soff;
if setcon/100 = 1 then set = 'AP';
run;
在您的代码中,您使用的是宏代码,因此您的步骤在内部解析为宏布尔语句 %if &set/100 resolved were %if setcon/100 其中 setcon 是一个字符串(这里我们是有条件地用宏语言说话,写变量的名称不会捕获变量的值,因为它完全独立于数据步骤)。
您应该只将宏语言考虑为可以为您写下代码的东西,例如您第一次尝试的东西可以用于有条件地将语句插入到宏变量的值中,例如:
data try;
set want;
%if ¯ovar=A %then %do;
if var1=1 and var2='B' then var3='C';
%end;
%if ¯ovar=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;
但是您也可以在数据步之外使用宏代码,例如根据宏变量的值有条件地执行数据步或其他内容:
%if ¯ovar=A %then %do;
data try; set tr;
some code;
run;
%end;
%else %if ¯ovar=B %then %do;
proc sort data=tr out=try nodupkey; by var1; run;
%end;