我想编写一个代码,在某些条件下将执行不同的proc表格。问题出在宏内部。没有改变,一切都运行得很好。 代码的想法很简单,但这是我第一次做出类似的东西。根据数据 makro 中的值x,将执行不同的宏。我不知道应该如何在宏内部定义变量。
data makro;
set number;
if number < 20 then x=1;
else x=2;
run;
proc format;
value temp 70- HIGH='red';
run;
PROC SQL;
CREATE TABLE Stat_for_&cel AS
SELECT distinct t1.&zmienna,
t1.&cel,
t2.number,
(COUNT(t1.cid)) AS ILE
FROM zrodlo.abt_app t1 left join ile_zmiennych t2 on t1.&zmienna=t2.&zmienna where t1.&zmienna not is missing
GROUP BY t1.&zmienna,
t1.&cel
ORDER BY t1.&zmienna DESC;
QUIT;
%macro tabelka1(Statystyka_dla_cel,&ILE,&cel,&zmienna);
proc format;
value temp 70- HIGH='red';
run;
PROC TABULATE
DATA= &&Stat_for_&cel format=commax10.2 ;
VAR &&ILE;
CLASS &&zmienna/ MISSING;
CLASS &&cel/ MISSING;
TABLE
/* Row Dimension */
&&cel,
/* Column Dimension */
&&ILE* ColPctSum* &&zmienna*[style=[background=temp.]];
RUN;
%mend tabelka1;
data makro_2;
set makro;
if x=1 then call execute ('%tabelka1');
run;
编辑:添加来自'回答'的信息,因为它不是答案。
代码应该像那样工作。 &amp; Cel和&amp; zmienna只是我想在proc制表过程中使用的变量,它们是在代码开头手动定义的。当'number'为&lt; 20时,我想只运行一次宏。在接下来的几个步骤中,我只使用proc格式准备数据,并创建一个表'Stat_for_&amp; cel',稍后将其用作proc制表过程中的数据。
主要问题是%macro tabelka1内部,我相信。我不知道如何在宏中实现变量&amp; cel和&amp; zmienna。
答案 0 :(得分:0)
我认为你在宏的定义中混合参数,然后是实际用法。您错误地定义了宏。而不是:
%macro tabelka1(Statystyka_dla_cel,&ILE,&cel,&zmienna);
应该是:
%macro tabelka1(Statystyka_dla_cel,ILE,cel,zmienna);
然后当您调用宏或尝试使用它时,可以传递宏变量。
%tabelka1(Statystyka_dla_cel,&ILE,&cel,&zmienna);
就个人而言,我更喜欢使用=符号来帮助突出显示参数名称和正在使用的值之间的差异。这是一个简单的例子:
%macro print_vars(dsin= , vars= );
proc print data=&dsin;
var &vars;
run;
%mend;
然后你可以将宏调用为:
%print_vars(dsin=sashelp.class, vars= name age);
答案 1 :(得分:0)
明确了解各种术语的含义非常重要。宏变量是一个数据存储位置,具有名称和值。宏变量名称类似于'ile','cel'等。但请注意,宏变量的名称不包含&符号 !!有多种方法可以访问宏变量的值,所有这些都涉及使用其名称。最常见的方法是使用&<macro variable name>
,但您也可以使用(在数据步骤中)x = symget('<macro variable name>')
例如 - 此处没有符号。
答案 2 :(得分:-1)
没有任何参数定义宏没有任何问题。您只需引用宏代码中的宏变量并将其保留给宏的用户,以确保在调用宏之前定义了宏变量。
%macro tabelka1;
proc format;
value temp 70- HIGH='red';
run;
PROC TABULATE DATA=Stat_for_&cel format=commax10.2 ;
VAR &ILE;
CLASS &zmienna/ MISSING;
CLASS &cel/ MISSING;
TABLE &cel,&ILE*ColPctSum*&zmienna*[style=[background=temp.]];
RUN;
%mend tabelka1;
然后有条件地调用宏,你可以使用数据步骤。
data _null_;
set makro;
if x=1;
call execute('%nrstr(%tabelka1);');
stop;
run;