我无法找到此错误的解决方案。我尝试使用%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.
答案 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 ¯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;
但是您也可以在datastep外部使用宏代码,例如,有条不紊地执行datastep或其他内容到宏变量的值:
%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;