全局宏变量(使用CALL SYMPUTX创建)赢得';无法在SAS宏程序中正确解析

全局宏变量(使用CALL SYMPUTX创建)赢得';无法在SAS宏程序中正确解析,sas,sas-macro,Sas,Sas Macro,我对SAS中的宏编码非常陌生,所以我主要是在寻找正确的方向 我试图创建一个大的宏程序,在其中我使用CALL SYMPUTX来创建我在宏程序中引用的几个全局宏变量。我的代码如下: options symbolgen mlogic; filename ALBB 'C:\[file path]\AL.csv'; libname mylibx 'C:\[file path]\ALBB'; %macro baseball(al=mylibx.al, nl=myliby.nl, var1=salary,

我对SAS中的宏编码非常陌生,所以我主要是在寻找正确的方向

我试图创建一个大的宏程序,在其中我使用
CALL SYMPUTX
来创建我在宏程序中引用的几个全局宏变量。我的代码如下:

options symbolgen mlogic;
filename ALBB 'C:\[file path]\AL.csv';
libname mylibx 'C:\[file path]\ALBB';

%macro baseball(al=mylibx.al, nl=myliby.nl, var1=salary, class1=position, pd=percent_deviation);

data &al;
infile ALBB dlm=',' dsd firstobs=5 obs=381;
input team :$20. name :$20. salary :comma12. position :$20.;
run;

proc print data=&al (firstobs=1 obs=6);
format &var1 comma12.;
run;

proc means data=&al noprint;
var &var1;
class &class1;
output out=med_al median=med;
run;

data median_al;
set med_al;
if _TYPE_ = 0 then delete;
run;

****Macro Variables in question are below****
data _NULL_;
set &al;
    if &class1='Catcher' then call symputx('MedianC',med);
    if &class1='Catcher' then call symputx('FrequencyC',_FREQ_);
    if &class1='First Baseman' then call symputx('MedianFB',med);
    if &class1='First Baseman' then call symputx('FrequencyFB',_FREQ_);
    if &class1='Outfielder' then call symputx('MedianO',med);
    if &class1='Outfielder' then call symputx('FrequencyO',_FREQ_);
    if &class1='Pitcher' then call symputx('MedianP',med);
    if &class1='Pitcher' then call symputx('FrequencyP',_FREQ_);
    if &class1='Second Baseman' then call symputx('MedianSB',med);
    if &class1='Second Baseman' then call symputx('FrequencySB',_FREQ_);
    if &class1='Shortstop' then call symputx('MedianS',med);
    if &class1='Shortstop' then call symputx('FrequencyS',_FREQ_);
    if &class1='Third Baseman' then call symputx('MedianTB',med);
    if &class1='Third Baseman' then call symputx('FrequencyTB',_FREQ_);
run;

data temp;
set &al;
    if &class1='Catcher' then &pd=((&var1-&MedianC)/(&MedianC))*100;
    if &class1='First Baseman' then &pd=((&var1-&MedianFB)/(&MedianFB))*100;
    if &class1='Outfielder' then &pd=((&var1-&MedianO)/(&MedianO))*100;
    if &class1='Pitcher' then &pd=((&var1-&MedianP)/(&MedianP))*100;
    if &class1='Second Baseman' then &pd=((&var1-&MedianSB)/(&MedianSB))*100;
    if &class1='Shortstop' then &pd=((&var1-&MedianS)/(&MedianS))*100;
    if &class1='Third Baseman' then &pd=((&var1-&MedianTB)/(&MedianTB))*100;
run;

proc print data=temp (firstobs=1 obs=10);
title 'Information about Baseball Players';
footnote1 %sysfunc(putn(&MedianC, dollar12.)) &FrequencyC;
footnote2 %sysfunc(putn(&MedianFB, dollar12.)) &FrequencyFB;
footnote3 %sysfunc(putn(&MedianO, dollar12.)) &FrequencyO;
footnote4 %sysfunc(putn(&MedianP, dollar12.)) &FrequencyP;
footnote5 %sysfunc(putn(&MedianSB, dollar12.)) &FrequencySB;
footnote6 %sysfunc(putn(&MedianS, dollar12.)) &FrequencyS;
footnote7 %sysfunc(putn(&MedianTB, dollar12.)) &FrequencyTB;
run;

%mend baseball;
%baseball()
虽然我不确定是否正确执行了这些操作,但很明显我的
'MedianX'
'FrequencyX'
宏变量不起作用。它们解析为缺少的值(而在宏程序之外,它们解析正确)


有人能提供一些指导吗?非常感谢

只要将其复制到SAS中,就会显示数据null语句第28行被删除,因为第27行的注释没有结束分号。加上这一点,这对我来说是基于我制作的电子表格


此外,null和temp表中有set&al,这是您的第一个数据集,因此不包含med和FREQ变量,这些变量应读取set MEDIANT__________________________________________。加上这一点,这对我来说是基于我制作的电子表格


此外,null表和temp表都有set&al,这是您的第一个数据集,因此不包含med和FREQ变量,这些变量应该读取set MEDIANT__al才能正确解析。

如果没有数据,很难复制它。我的直觉是,这是多重if语句,而不是if/then语句。如果在data null步骤后添加一堆%put,会发生什么情况?有宏变量解析吗?我不会这样写代码。将类上生成的平均值数据集合并到主数据集,然后就有了所有这些变量。宏变量真的不适合这样的数据。没有数据很难复制它。我的直觉是,这是多重if语句,而不是if/then语句。如果在data null步骤后添加一堆%put,会发生什么情况?有宏变量解析吗?我不会这样写代码。将类上生成的平均值数据集合并到主数据集,然后就有了所有这些变量。宏变量真的不是这样的数据。同意,如果这是原因,它应该从日志中的错误中显而易见。当进行宏编程时,如果启用了选项MPRINT,日志将更易于阅读。我只是在这里添加了注释以使我的问题更清楚。它不在我的原始代码中。但是关于
&al
,你肯定是对的,我犯了一个愚蠢的错误。谢谢你的帮助!同意,如果这是原因,那么应该从日志中的错误中看出。当进行宏编程时,如果启用了选项MPRINT,日志将更易于阅读。我只是在这里添加了注释以使我的问题更清楚。它不在我的原始代码中。但是关于
&al
,你肯定是对的,我犯了一个愚蠢的错误。谢谢你的帮助!