你能帮我解决这个问题吗?我试图将数组中的几个标题传递给SAS宏来创建图形。我是SAS编程的新手,我无法弄清楚它是如何发生的。非常感谢你的帮助。
/*Create Trend Chart*/
%macro trendChart(dataFile,xVariable,yVariable,group);
proc gplot data=&dataFile;
plot &yVariable*&xVariable=&group;
symbol1 v=star c=blue;
title "Time Series Plot";
run;
quit;
%mend trendChart;
data _null_;
/*Create Trend Chart*/
Array variableList[*] Res_Rd1 OW_perp_Rd2;
do i=1 to dim(variableList);
var_name=vname(variableList[i]);
put var_name;
%trendChart(TDMR.Children,M_Date,var_name,t_);
end;
run;
答案 0 :(得分:1)
您无法在宏调用中引用数据步变量的值。因此,在您的宏调用中,值VAR_NAME只是作为要在其生成的PROC中使用的变量名称传递给宏。
您无法在彼此之间嵌套步骤。当宏调用执行时,它会生成SAS代码,然后由SAS编译和执行。当SAS看到PROC或DATA步骤启动时,它会立即停止编译当前步骤。因此,当SAS看到宏调用生成的PROC语句时,您的数据步骤将具有未闭合的DO循环。
您可以使用新宏来生成对现有宏的多次调用。
%macro run_charts(varlist);
%local i ;
%do i=1 %to %sysfunc(countw(&varlist));
%trendChart(TDMR.Children,M_Date,%scan(&varlist,&i),t_);
%end;
%mend run_charts;
%run_charts(Res_Rd1 OW_perp_Rd2);
如果要使用DATA步骤,则使用CALL EXECUTE()将宏调用推送到堆栈,以便在数据步骤结束后运行。在数据步骤中,如果要循环遍历字符串常量值列表,则可以在DO语句中列出。无需创建虚拟变量名称数组。
data _null_;
length var_name $32 ;
do var_name='Res_Rd1','OW_perp_Rd2';
call execute('%nrstr(%trendChart)(TDMR.Children,M_Date,'
||var_name ||',t_);'
);
end;
run;